网站首页 > 技术文章 正文
第一部分:数据的获取—爬虫
1.爬取目标:北京地区二手房房价:https://bj.5i5j.com/ershoufang/;
2.需要用到的模块:requests,re,random,time,csv,pandas.
3.开发环境vs2017,使用语言python,版本3.6.
4.开发流程
1) 对目标网站的反扒进行试探,识别其反扒机制。(爬取网站是要看一下网站的robots协议,不要爬取网站禁止爬取的内容,否则会面临被起诉的危险)
1.首先在浏览器内启动web开发者查看器。进入网络栏,点击XHR,刷新页面,查看是否有ajax请求。如图所示并未出现ajax请求:
2.进入交互式环境,查看爬取网站是否存在需要模拟浏览器,或者模拟登录的情况。
如图所示此网站反扒机制较为容易:
2).设计爬虫大体的功能实现:
get_text()函数获取爬取网站的html源代码,这里应该考虑使用requests获取响应出现异常的情况。在后续的爬取过程中出现了ip禁封的情况,在这里,有两种方法可以解决,1:运用ip代理池(但由于对免费的ip代理网站爬取后试验时,发现大都不能使用,所以放弃了这一条路线)2:利用随机数使爬虫爬取网页的时候,进行不定时的sleep,来防止ip被封。3:后来看了一些博客,有前辈说,可以建一个headers列表,来随机使用,从而防止ip被封的情况。(有待尝试)
2.get_useful函数利用正则表达式,获取html中的有效数据。
3.get_next():由于爬取网站需要不同的url,所以应该观察url的变化,利用函数构造下一个将要爬取的网页url.
4.数据的存储,由于要进行可视化处理,所以要对存储的数据类型做好处理,便于可视化时的文本调用,这里运用csv模块,将数据存储为csv文件。
3)源码展示
#coding:utf-8
import re
import requests
import random
import time
import sys
import csv
import pandas
def get_text(url):
try:
n = random.uniform(1,2)
time.sleep(n)
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3381.1 Safari/537.36"}
res = requests.get(url,headers = headers,timeout = 3)
res.raise_for_status()
res.encoding = res.apparent_encoding
return res.text
except:
print("出现异常")
return None
def get_useful(text):
pattern = r'<div>.*?<strong>(\d+)</strong>.*?</p>.*?<p>单价(.*?)元/m2</p>.*? </div>'
pattern = re.compile(pattern,re.S)
data = re.findall(pattern,text)
return data
def get_next(url):
try:
for i in range(1,101):
url = url + "n" + str(i)
text = get_text(url)
pre_data = get_useful(text)
data = []
for num in pre_data:
num = list(num)
data.append(num)
name = url.split('/')[-2]
filename = r"F:/" +name+ ".csv"
file = open(filename,"a",newline = '')
writer = csv.writer(file,dialect='excel')
writer.writerows(data)
file.close()
data =[]
print("第%d页已爬取成功"%i)
except:
print("出现异常")
return None
def main():
area = ["tongzhouqu/","changpingqu/","daxingqu/","shunyiqu/","fangshanqu/","beijingzhoubian/"]
for i in area:
url = "https://bj.5i5j.com/ershoufang/"
url = url+str(i)
print("爬取网址:%s"%url)
get_next(url)
if __name__=="__main__":
main()
第二部分:数据可视化—pandas和pygal的使用
可视化之前比较了一下, matplotlib和pygal(虽然pygal也是基于matplotlib的),感觉pygal更加便于使用,而且直接保存为svg的格式,这样可以让用flask时导入图片更加方便,减少了我自己写html的工作量。
可视化较为简单,所以这里就不详细介绍了。贴一段代码;
import pygal
import pandas as pd
#设置全北京的数据列表
all_zj = []
all_dj = []
#朝阳区
file = open(r"F:/chaoyangqu.csv",'r')#打开文件
data = pd.read_csv(file)#读入csv文件
pre_zj = data.iloc[:,0]#将每栋房子的总价提取
zj = []
for i in pre_zj:
zj.append(i)
all_zj+=zj#存入汇总的列表,用于全北京的可视化处理,下同
pre_dj = data.iloc[:,1]#将每栋房子的每平米单价提取
dj =[]
for i in pre_dj:
dj.append(i)
all_dj+=dj
#总价分析
y_list = [0,0,0,0,0,0,0,0,0,0]
for i in zj:
if i <= 300:
y_list[0]+=1
if i <=400:
y_list[1]+=1
if i <=500:
y_list[2]+=1
if i <=600:
y_list[3]+=1
if i <=700:
y_list[4]+=1
if i <=800:
y_list[5]+=1
if i <=900:
y_list[6]+=1
if i <=1000:
y_list[7]+=1
if i <=1100:
y_list[8]+=1
if i <=1200:
y_list[9]+=1
cyq = pygal.Bar()
cyq.title = "朝阳区二手房数据统计"
cyq.x_labels = [250,350,450,550,650,750,850,950,1050,1150] #X轴数据
cyq.x_title = "房屋总价"
cyq.y_title = "房屋数量"
cyq.add('朝阳区',y_list)
cyq.render_to_file("F:/cyqzj.svg")
#单价分析
dj_max = max(dj)
dj_min = min(dj)
fg = (dj_max-dj_min)/10
x_list = [0,0,0,0,0,0,0,0,0,0]
for i in range(0,10):
x_list[i] += dj_min+fg*i
y_list = [0,0,0,0,0,0,0,0,0,0]
for i in dj:
if i <= x_list[0]:
y_list[0]+=1
if i <= x_list[1]:
y_list[1]+=1
if i <= x_list[2]:
y_list[2]+=1
if i <= x_list[3]:
y_list[3]+=1
if i <= x_list[4]:
y_list[4]+=1
if i <= x_list[5]:
y_list[5]+=1
if i <= x_list[6]:
y_list[6]+=1
if i <= x_list[7]:
y_list[7]+=1
if i <= x_list[8]:
y_list[8]+=1
if i <= dj_max:
y_list[9]+=1
cyq = pygal.Bar()
cyq.title = "朝阳区二手房每平米单价数据统计"
cyq.x_labels = x_list#X轴数据
cyq.x_title = "房屋每平米单价"
cyq.y_title = "数量"
cyq.add('朝阳区',y_list)
cyq.render_to_file("F:/cyqdj.svg")#存储为svg文件
第三部分:flask框架的使用
1.由于前两部分皆在windows环境下开发,但我在乌班图环境下使用flask框架,需要一个方式,将我做完的svg图片传入乌班图,可以在虚拟机可主机之间创建一个共享文件夹,以便文件的传输。
具体方法:
下载Vmware Tool文件,在根目录创建文件夹VmwareTool,将其解压在此目录下,然后关机,在虚拟机设置里找到共享文件夹,进行设置即可。
2.Falsk框架目录结构:
1.falsk框架的大体结构
1) 主文件
这里利用route()装饰器来设置路由,其中第一个返回可以个html文档,第二个返回了一个svg图像。
2)
由于使用的是虚拟机,所以写完的flask框架只能够本地访问,但可以改变虚拟机的网络联接方式(将net连接改为自定义桥接),从而实现校园网内可以自由访问,并且需要设置静态ip,使程序不用连一次网,就要改一次host.
3.)templates目录下存放着使用jinjia2模版引擎写的html文件,在主文件中可以使用render_template()进行调用。
4)static目录下存放了css文件和网页背景等一些静态文件。
5)效果图:
猜你喜欢
- 2024-10-15 Python Flask Web表单(flask form表单)
- 2024-10-15 如何在Flask应用程序中使用JSON Web Tokens进行安全认证
- 2024-10-15 综合指南:将 Flask 与 MongoDB 结合使用
- 2024-10-15 python-flask搭建平台,HTML+CSS+JS写前端的web全栈-动画轮播
- 2024-10-15 Flask 表单处理(flask formdata)
- 2024-10-15 三、flask博客项目实战-之表单(flask 表单)
- 2024-10-15 flask python web开发的简单易学框架
- 2024-10-15 Flask-APScheduler使用教程(flask apscheduler)
- 2024-10-15 flask 项目中使用 bootstrapFileInput(进阶篇)
- 2024-10-15 iOS 17.3已修复,“快捷指令”高危漏洞被披露:可发送敏感数据
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)