划一下重点:本文更适合于有一定的爬虫基础的人来学习
最好需要对scrapy框架有一定的了解,(没有的话也没关系,来看个思路)
由于文章篇幅和图片数量限制,我不太可能一步步分析过程全部截图和用文字说出来,所以需要自己研究,觉得不懂的话我会将源码获取方式放到底部。
当前时间是2020-3-2,只能保证相差不远的时间爬虫有效,毕竟网页结构会变。
前言:
前两天使用爬虫爬取了房天下全国六百多个城市所有的新房和二手房信息,包括小区名字房子面积,原始url,几居几室,位置地址等数据信息。
代码量看起来有点多,但是大部分都是框架自带的代码,整个爬虫的逻辑很简单。
本爬虫爬取的内容没有使用ajax异步请求加载的,所以相对简单。
我会放一部分爬取下来的数据的截图放在文末
前期准备:
- 安装scrapy库:
pip install scrapy
用到的库
re(内置)
scrapy(需要安装)
random (内置)
分析需求:
我们要爬取的网站是房天下全国所有的城市的新房和二手房信息,首先进入房天下官网查看页面
显然这里不方便作为我们爬虫的开始页面,爬虫爬取网站需要一个结构化一点的,信息聚集排列比较整齐的页面。
经过一番查找进入到这个页面城市页面
ok从这里我们已经完全可以拿到所有城市的入口页面,是一个很理想的开始页面。
这里的每个城市都是一个链接,代表对应城市的房天下首页。
从这个页面中呢,我们让scrapy爬取所有的省份和它对应的城市,以及这个城市对应的首页链接。(通过审查元素,这个页面没有ajax异步加载,放心!)
例如,上海的首页链接就是http://sh.fang.com/
然后我们就可以从这里获取到它的新房列表页面和二手房列表页面。
我们依旧以上海为例,上海的新房页面链接和二手房页面链接分别是:
https://sh.newhouse.fang.com/house/s/
https://sh.esf.fang.com/
发现规律没有?
新房链接 = 首页链接中间 插入 .newhouse.
+ 首页链接末尾 加上 house/s/
二手房链接 = 首页链接中间插入 esf.
有了这个规律,现在就相当于我们从城市列表就能直接获取到所有城市的新房列表和二手房列表的url,这就很nice! (反正我是拼接获取到了,你们加油,手动狗头)
现在我们先分析新房的页面
经过分析我们可以知道
所有的这些一个个类似列表的盒子是一个个li
元素(这里负责任的告诉大家,我不可能是打广告的,哪有通过教你们爬虫来给它打广告的方式。)
然后我们获取li元素列表
这里需要提醒大家的是,前两个li
元素是ajax异步加载的,我估摸着应该是花了钱打广告上去的,这一部分我们不需要爬取。同时,获取li
元素列表的时候,会发现li
元素列表里面有个奸细,会导致你出错,看图⬇️
通过上面这张图,大家对它的内容的排放也有基本了解了。
然后我们开始分析我们需要从每个
li
元素里面获取的内容好了这些就是我们要爬下来的内容,全部都在li元素里面,由于这里就是一些重复的工作,我就不带大家一一分析了。
好我这里就当大家能爬取出每个li元素里面的内容了哈,我们进入下一个部分
当前我们只爬取了这一个页面,而就算爬完所有城市也不过每个城市爬了一个页面而已,我们要能够翻页。
下一页的网址就藏在这里,很好找,我们提取出这个元素里面的href属性,再用
sh.newhouse.fang.com/
来拼接一下,就成功得到下一页的网址了。
我们进入下一页,再爬下来想要的数据存储,再进入下一页,周而复始,直到最后一页,没有了这个下一页的元素会自动停止。
到这里呢,新房的数据就全部爬取完成!我们进入二手房页面分析元素
同样的,这里的列表一样的内容都是一个个
dl
元素组成的,但是这里就没有广告位了(我的理解是,个人毕竟没有这么多钱来打广告嘛)。
但是与新房页面相同的是,这里同样藏着个奸细,观察上图的审查元素可知,有一个 dl
元素的style="bgcomare"
而其他的都是bg
这就是奸细!
我们在获取dl列表的时候同样需要抛弃这个元素。
然后呢就进入到了内容爬取时间
这些就是需要爬下来的内容了。
啪嗒啪嗒,一顿分析元素获取文本内容之后~
现在进入翻页时间,我们分析一下下一页元素
这个时候你会发现,这里的p元素只能用序号来定位,而没有专门的class名或者id名,本来呢,这也不是什么大问题,但是偏偏现在这个p的顺序位置是在变动的,
因为当我们处于第一页的时候,前面没有出现首页
和 上一页
这两个按钮,而这两个按钮也是同级的p标签!
所以这里我们采用倒序,倒数第三个p标签,就是下一页本尊。
这里可能有人要发问了:那照这么说,到了最后一页获取p标签不是还会出错?
这里跟大家解释一下,当到了最后一页的时候,确实下一页
和第xx页
就消失了,倒数第三个p标签反而跑到前面的页面去了,会不会造成无限循环?
答案是:不会,因为我们使用的scrapy框架,这个框架有自动调度,不重复抓取同一个页面的功能。
数据存储
使用scrapy的管道来进行存储,因为这些数据我拿着也没用,就直接用一个json文件将爬到的数据存储了起来,同样在源码当中。
数据展示
新房数据
二手房数据
末尾
到这里呢,我们已经基本爬取完成了房天下网站所有城市新房二手房的数据了,没骗你们吧,就是这么简单。
提醒大家一句哈,由于数据量太大, 记得设置延迟,不要对人家服务器造成压力,做人留一线,然后就是,scrapy爬虫记得添加暂停功能。
scrapy全站爬虫源码获取方式:关注微信公众号【程序小员】后台发送房天下爬虫
我是落阳,一个正在努力成长的人,谢谢你的到访!