分享

小试爬虫牛刀——爬取楼盘信息

 徒步者的收藏 2019-01-11

最近泡在各大房源网站收集房源信息,突发奇想利用PYTHON爬虫技术收集房源信息,直接在本地文件夹实现快速游览房源的户型、价格、小区信息。本来可以使用python开源的爬虫框架scrapy、pyspider,但是本着学习练手的目的,决定自己动手丰衣足食。

python内置了两个网络库urllib和urllib2,但是这两个库使用起来不是特别方便,所以在这里我们使用一个广受好评的第三方库requests。使用requests只用很少的几行代码就可以实现设置代理,模拟登陆等比较复杂的爬虫工作。基本的思路就是使用requests获取页面信息,强大的BeautifulSoup解析页面,为了更加迅速的爬取数据,使用multiprocessing实现多进程抓取。再加之一些小技巧搞定反爬虫机制,开始动手。



一、封装底层使用得比较多的方法:


1.  每次去获取网页信息都需要调用一个方法:

get



为了爬虫程序持续工作,一定要捕捉异常。当此方法运行过程中requests.get一个url时报错,就是目标网站的反爬虫机制生效了,这时候就要利用一些手段去克服反爬虫。后面详。


2.下载图片的方法:down_pic



3.创建文件夹的方法:make_dir




二、获取城区每个区域内所有楼盘的信息:



此页面可以获取到楼盘平均价格,楼盘所在地址,以及下一步需要的楼盘页面url。

比如获取每个楼盘页面的url:




三、获取每个楼盘的户型图:


楼盘页面的url可以拼凑出每个楼盘的户型页面,但是在游览器界面会发现每张户型图切换是调用的javascript函数:



经过研究发现,由Javascript生成,基本会有Ajax请求,那就直接打开浏览器,然后F12.找到Network,切换到XHR会发现这么一个请求可以获取所有信息:



代码:



将户型的部分信息写入到户型图片的名称中,比如:2栋标准层1号房户型(2室2厅1卫1厨)(85.34平)(售完).jpg。

调用底层下载图片的方法保存图片到指定路径




四、搞定反爬虫:


还记得在底层方法get中,捕捉到requests.get异常后,大概率是目标网站的反爬虫机制生效了,而我选择的是以下几招。


1.第一招:

更换请求头部headers中的'User-Agent',定义n个可使用的'User-Agent',每次请求随机选择一个:



headers = self.random_headers()


2.第二招:

使用代理ip,去免费代理ip网站爬取可以使用的代理ip,并使用代理IP继续工作。



3.第三招:

此次爬虫反爬虫机制的杀招,那就是更换运营商账号拨号获取不同的IP继续爬取。具体做法是:在开始爬取之后,再启动一个进程检查网络情况,在爬虫代码捕捉到异常后,马上断开网络,另外的进程在检测到网络异常后,马上开始更换账号拨号。

捕捉异常,随机断开网络(因为启动10个进程,基本上可以保证马上断开网络)

检查网络情况,一旦网络断开,调用拨号程序拨号:



拨号程序



因为至少50个运营商账号可以使用,这个办法非常有用,比代理IP更快比更换请求头部更有效。(别问我账号怎么来的,哈哈)



五、开始爬取:

代码测试完成过后就可以开始爬取工作了。



调用multiprocessing,在本地文件I/O处加Lock防止阻塞,使用log文件记录的方式实现中断续爬。当然在爬取过程中需要保存当前工作的上下文,以便在一些原因下爬虫中断了可以继续爬取。



结语:

各大房源网站的数据信息过于庞杂,收集户型信息对比都不方便,花上几个小时写个爬虫和抓取需要的信息的确很是方便。最后的效果如下:



恩,就酱,谢谢。




本文作者:杨阳(点融黑帮),python爱好者,最近喜欢踢足球、玩狼人杀。目前就职于点融成都分公司,IT技术工程师。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多