很多朋友对于下载房产网站源码分享和房产中介网站源码不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
数据抓取
爬虫架构设计
通过分析链家网的URL,不难发现,每一个城市的链家网的基本格式是:
城市名简拼+”.lianjia.com“
所以整个爬虫最外层应该是遍历一个保存城市简拼的列表,拼接得到一个个起始URL,根据这些URL爬取对应城市的链家网。
针对每一个城市的链家网而言,首先得到该城市在售二手房的总套数,由于每一页显示的套数是30,由总套数整除以30再加上1可以得到总页数,但是由于最大可浏览页数为100,所以我们这里得加个判断,如果总页数大于100的话,令总页数等于100。
分析具体城市的链家网每一页的URL,以北京为例,我们可以发现第N页的URL是:
bj.lianjia.com/ershoufang/pg{N},由此我们可以通过以下代码来得到每一页的URL:
\n\n
foriinrange(total_page):
page_url=”bj.lianjia.com/ershoufang/pg{}”.format(i+1)
本来得到每一页的URL后,我们可以得到该页上30套房的房价信息和详情页URL,但是页面上没有房子所在区的信息。
我们只能再向下请求访问详情页URL,从而提取出我们想要的所有数据。
综上所述,我们可以将整个框架从上往下分为四层,如下图所示:
基于上述思路,在写代码的时候,可以分层从上往下实现,方便调试。
第一层&第二层:获取总套数
根据城市简拼得到起始URL,并得到总套数,为分页做准备。
\n\n
defget_list_page_url(city):
start_url=”https://{}.lianjia.com/ershoufang”.format(city)
headers={
‘User-Agent’:’Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.100Safari/537.36′,
}
try:
response=requests.get(start_url,headers=headers)
只能访问到前一百页
iftotal_page>100:
total_page=100
page_url_list=list()
foriinrange(total_page):
url=start_url+”/pg”+str(i+1)+”/”
page_url_list.append(url)
detail_url是得到的详情页URL
detail_dict=dict()
doc=pq(response.text)
unit_price=doc(“.unitPriceValue”).text()
unit_price=unit_price[0:unit_price.index(“元”)]
title=doc(“h1”).text()
area=doc(“.areaName.infoa”).eq(0).text().strip()
url=detail_url
多线程爬取
由于待爬取的数据量巨大,使用单线程速度太慢,最开始采用了第三方库ThreadPool来实现多线程,后来了解到Python3.5的内置包concurrent.futures,使用里面的ThreadPoolExecutor来实现多线程,速度又提升了20%以上。
\n\n
p=ThreadPoolExecutor(30)
forpage_urlinpage_url_list:
p.submit(get_detail_page_url,page_url).add_done_callback(detail_page_parser)
p.shutdown()
第1行通过构造函数新建了线程池对象,最大可并发线程数指定为30,如不指定,其默认值是CPU数的5倍,第2、3行依次把爬取的任务提交到线程池中,并设置回调函数,这里的回调函数拿到的是一包含get_detail_page_url返回值的对象。
并把这个对象作为回调函数的参数res,先把返回的res得到一个结果,即在前面加上一个res.result(),这个结果就是get_detail_page_url的返回值。
IP代理池
由于爬取的数量大,同时由于多线程提高了速度,链家网会拒绝访问,这时可通过代理IP来访问,这里使用已经有的轮子,源码链接附在文末。
下载后新开一个Pycharm视窗运行该项目,然后我们可以用下面的方式来获取可用的代理IP:
\n\n
defget_valid_ip():
url=”http://localhost:5000/get”
try:
ip=requests.get(url).text
returnip
except:
print(“请先运行代理池”)
然后通过参数设置使用代理IP:
\n\n
proxies={
“http”:”http://”+get_valid_ip(),
}
response=requests.get(url=detail_url,headers=headers,proxies=proxies)
数据保存
采用JSON文件形式保存数据,每个城市保存一个JSON文件,文件名为该城市简拼。
\n\n
defsave_data(data,filename):
withopen(filename+”.json”,’w’,encoding=”utf-8″)asf:
f.write(json.dumps(data,indent=2,ensure_ascii=False))
稍等一会儿,所有数据就保存在本地了:
本爬虫所爬数据仅为本人测试,严禁商用。
数据分析
数据整合
在这里做一些求同地区房价最大值、最小值、平均值,以及数据格式统一化的工作:
\n\n
defsplit_data():
globalregion_data
region_data=dict()
forregionindic_data.keys():
保留两位小数
region_data[region][“average”]=round(region_data[region][“average”],2)
数据可视化
将分析结果通过Matplotlib直观的体现出来,该部分的代码如下:
\n\n
defdata_viewer():
label_list=region_data.keys()plt.ylim(0,50)#y轴取值范围
plt.ylabel(“房价/元”)
“””
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
“””
plt.xticks([index+0.2forindexinx],label_list)
plt.xlabel(“地区”)
plt.legend()
forrectinrects1:
height=rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2,height+1,str(height),ha=”center”,va=”bottom”)
forrectinrects2:
height=rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2,height+1,str(height),ha=”center”,va=”bottom”)
forrectinrects3:
height=rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2,height+1,str(height),ha=”center”,va=”bottom”)
plt.show()
结果如下:
限于篇幅,其他城市的图就不放了。
再来看全国主要一线城市二手房房价有序条形图:
可以看出,北京、上海、深圳的房价大致在同一水平线,而厦门位于第四,广州在第六,最后看一下房价地域图:
Python交流,提供技术服务,共同讨论,欢迎各路萌新和大神加入,群号;601020339
关于下载房产网站源码分享和房产中介网站源码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
