通过分页、线程池、代理池等技术,快速爬取链家网近4万条在售二手房信息,速度可达 10000 条 / 5 分钟。
通过对二手房作数据分析,得到北上广深等(新)一线城市四地房价的纵向比较,同时对各个城市各个区的房价做横向对比,并将对比结果可视化出来。
主要用到的库或模块包括 Requests、PyQuery、ThreadPoolExecutor、JSON、Matplotlib、PyEcharts。
环境:Widnows10、Python3.5、Pycharm2018。
数据抓取
爬虫架构设计
通过分析链家网的 URL ,不难发现,每一个城市的链家网的基本格式是:
城市名简拼 + ”.lianjia.com“
所以整个爬虫最外层应该是遍历一个保存城市简拼的列表,拼接得到一个个起始 URL,根据这些 URL 爬取对应城市的链家网。
针对每一个城市的链家网而言,首先得到该城市在售二手房的总套数,由于每一页显示的套数是 30,由总套数整除以30再加上1可以得到总页数,但是由于最大可浏览页数为 100,所以我们这里得加个判断,如果总页数大于 100 的话,令总页数等于 100。在这里还是要推荐下我自己建的裙前面是304再加上050最后是799,裙里都是学Python开发的,如果你正在学习Python ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2018最新的Python进阶资料和高级开发教程,欢迎进阶中和进想深入Python的小伙伴
分析具体城市的链家网每一页的 URL, 以北京为例,我们可以发现第 N 页的 URL 是:
bj.lianjia.com/ershoufang/pg{N},由此我们可以通过以下代码来得到每一页的 URL:
for i in range(total_page):
page_url = "bj.lianjia.com/ershoufang/pg{}".format(i+1)
本来得到每一页的 URL 后,我们可以得到该页上 30 套房的房价信息和详情页 URL,但是页面上没有房子所在区的信息。
我们只能再向下请求访问详情页 URL,从而提取出我们想要的所有数据。
综上所述,我们可以将整个框架从上往下分为四层,如下图所示:
基于上述思路,在写代码的时候,可以分层从上往下实现,方便调试。
第一层 & 第二层:获取总套数
根据城市简拼得到起始 URL,并得到总套数,为分页做准备。
def get_list_page_url(city):
start_url = "https://{}.lianjia.com/ershoufang".format(city)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome