小试爬虫牛刀-爬取楼盘信息
最近泡在各大房源网站收集房源信息,突发奇想利用python爬虫技术收集房源信息,直接在本地文件夹实现快速游览房源的户型、价格、小区信息。本来可以使用python开源的爬虫框架scrapy、pyspider,但是本着学习练手的目的,决定自己动手丰衣足食。 python内置了两个网络库 rllib和 rllib2,但是这两个库使用起来不是特别方便,所以在这里我们使用一个广受好评的第三方库req ests。使用req ests只用很少的几行代码就可以实现设置代理,模拟登陆等比较复杂的爬虫工作。基本的思路就是使用req ests获取页面信息,强大的bea tif lso p解析页面,为了更加迅速的爬取数据,使用m ltiprocessing实现多进程抓取。再加之一些小技巧搞定反爬虫机制,开始动手。 一、封装底层使用得比较多的方法: 1. 每次去获取网页信息都需要调用一个方法: get 为了爬虫程序持续工作,一定要捕捉异常。当此方法运行过程中req ests.get一个 rl时报错,就是目标网站的反爬虫机制生效了,这时候就要利用一些手段去克服反爬虫。后面详。 2.下载图片的方法:down_pic 3.创建文件夹的方法:make_dir 二、获取城 区每个区域内所有楼盘的信息: 此页面可以获取到楼盘平均价格,楼盘所在地址,以及下一步需要的楼盘页面 rl。 比如获取每个楼盘页面的 rl: 三、获取每个楼盘的户型图: 楼盘页面的 rl可以拼凑出每个楼盘的户型页面,但是在游览器界面会发现每张户型图切换是调用的java函数: 经过研究发现,由java生成,基本会有ajax请求,那就直接打开浏览器,然后f12.找到network,切换到xhr会发现这么一个请求可以获取所有信息: 代码: 将户型的部分信息写入到户型图片的名称中,比如:2栋标准层1号房户型(2室2厅1卫1厨)(85.34平)(售完).jpg。 调用底层下载图片的方法保存图片到指定路径 四、搞定反爬虫: 还记得在底层方法get中,捕捉到req ests.get异常后,大概率是目标网站的反爬虫机制生效了,而我选择的是以下几招。 1.第一招: 更换请求头部headers中的"user-agent",定义n个可使用的"user-agent",每次请求随机选择一个: headers = self.random_headers 2.第二招: 使用代理ip,去免费代理ip网站爬取可以使用的代理ip,并使用代理ip继续工作。 3.第三招: 此次爬虫反爬虫机制的杀招,那就是更换运营商账号拨号获取不同的ip继续爬取。具体做法是: 在开始爬取之后,再启动一个进程检查网络情况,在爬虫代码捕捉到异常后,马上断开网络,另外的进程在检测到网络异常后,马上开始更换账号拨号。 捕捉异常,随机断开网络(因为启动10个进程,基本上可以保证马上断开网络) 检查网络情况,一旦网络断开,调用拨号程序拨号: 拨号程序 因为至少50个运营商账号可以使用,这个办法非常有用,比代理ip更快比更换请求头部更有效。(别问我账号怎么来的,哈哈) 五、开始爬取: 代码测试完成过后就可以开始爬取工作了。 调用m ltiprocessing,在本地文件io处加lock防止阻塞,使用log文件记录的方式实现中断续爬。当然在爬取过程中需要保存当前工作的上下文,以便在一些原因下爬虫中断了可以继续爬取。 结语: 各大房源网站的数据信息过于庞杂,收集户型信息对比都不方便,花上几个小时写个爬虫和抓取需要的信息的确很是方便。最后的效果如下: 恩,就酱,谢谢。