【Python-爬虫】某城租房数据全量采集项目

    互联网时代,很多人迷恋网络数据的采集,比如那堆拥有不同技术水平的爬虫爱好者,或者是技术达到云端的大咖。不管是自己需要用到该数据,还是仅仅是为了淬炼爬虫技术,只要实施爬虫行为,都需要本着对自己负责且避免给目标站点施以强载荷的原则,绅士的、规范的获取目标站点的数据。本文重在分享搭建爬虫的思路,对某城的一些敏感技术会做特殊处理。

1 项目背景

    一位做学术研究的客户,需要我国各城市的住房出租的数据,包括住房位置、交通情况、房间类型、房屋面积、月租价格等信息。在探索链家、安居客、贝壳、某城等租房网站后,发现某城的数据范围最广,最符合客户的学术要求。
    同时,某城的反爬机制也超强,比如房间的关键数据利用自定义字体强加密、IP的超低频率访问限制、数据错位渲染等。这就需要制定专门的爬虫措施,来绕过该站点的反爬陷阱,实现数据提取。

2 站点探索

2.1 探索站点结构

2.1.1 地理范围探索

    通过首页源码查看某城服务的范围,包括各省各市各辖区等数据,及其对应的站点编码。
【Python-爬虫】某城租房数据全量采集项目_第1张图片

2.1.2 数据列表存放探索

    通过浏览器审查网页结构元素,发现所有的房间信息全部被存放到“ul”标签、“class=“”house-list”属性下。
【Python-爬虫】某城租房数据全量采集项目_第2张图片

2.1.3 数据字段标签探索

    房间的租房信息中,价格的数据是和其他数据分离的,交错放在不同的父级标签下,但在列表上的索引位置没有发生任何改变。
【Python-爬虫】某城租房数据全量采集项目_第3张图片

2.1.4 站点反爬机制探索

    房间数据列表中所有的阿拉伯数字都用自定义字体加密处理,直接获取源码得到的数据是无法识别的,需要要经过解密还原。
【Python-爬虫】某城租房数据全量采集项目_第4张图片
    在频繁加载同一级别的网页后,网站会封禁当前ip,需要手动解锁后才能继续。
【Python-爬虫】某城租房数据全量采集项目_第5张图片

2.2 对应方案架构

    在2.1的站点探索中,发现很多爬虫的坑,下面给出了应对方案。

【Python-爬虫】某城租房数据全量采集项目_第6张图片

3 数据领储流程

    对目标站点的结构、反爬机制探索过后,接下来就是编辑爬虫机器人帮我们到站点领取数据。要编辑一个爬虫机器人,需要怎么做呢?看看下面的流程图吧!

3.1 流程事项

3.1.1 必备工具

    在做数据采集项目之前,必须具备的三类工具:探索类、爬取类、储存类。这三类工具使得数据采集工作形成一个完整的“生态链”,可以根据需求去探索到有哪些数据可能或者肯定有用,然后构建数据爬取规则去拿到这些数据,最后储存在数据库中。这三类工具具体都有哪些那?小落首推下面这几款(百度-官网-安装):

工具类型 重点推荐
探索类 *** G o o g l e C h r o m e Google Chrome GoogleChrome浏览器、 F i r e f o x Firefox Firefox浏览器
爬取类 *** P y t h o n Python Python语言、 R R R语言
储存类 *** M y S Q L My SQL MySQL M o n g o D B MongoDB MongoDB

    小落在本次项目中,通过 G o o g l e C h r o m e Google Chrome GoogleChrome探索租房数据在网页源码上的规则,再通过 P y t h o n Python Python来构建对于的采集机制,然后将数据存放到本地 M y S Q L My SQL MySQL服务器。如果采集的是非结构化数据如视频、图片这类二进制文件,可选择 M o n g o D B MongoDB MongoDB作为储存类工具。无独有偶, R R R语言也可用于做爬虫, F i r e f o x Firefox Firefox浏览器也可成为探索类工具帮我们发现数据规则。

3.2.2 代理IP池

    代理IP池的搭建有很多方法,不同的方法使得获得的IP质量各有差异,总的来说是花钱的效果好些。代理IP一般有如下三类方法:

方法 IP质量(*****) 小落资源
西刺免费代理搭建 **免费:较差,不稳定,要筛选,效率低、存活时间较短 https://github.com/lda188/my-data/blob/master/xici_mypool.py
快代理购买IP搭建 ***便宜:可直接获取,不用筛选,存活时间较短 https://github.com/lda188/my-data/blob/master/kuai_ip.py
代理服务器搭建 ***比较贵:不需要在程序端接入IP,效率较高,存活时间较长 需下载代理软件

    搭建代理IP池,可以通过Redis,Flask,Python结合搭建。我是直接单独使用Python控制流+队列实现。弄了两个代理池,一个是基于西刺代理的免费代理池,一个是快代理购买IP搭建的便宜代理池。利用代理可以避免同一个真实IP频繁访问网站被封的坑。

3.3 数据采集

    前面已经说到了目标站点的数据规则探索,也提到了IP代理池的概念。那么我们就可以利用Python编写一个爬虫机器人,它就干一件事:吃掉一个url,吐出url下的结构化目标数据并存入My SQL 服务器。在数据建模时根据业务需求从数据库提取数据使用。
【Python-爬虫】某城租房数据全量采集项目_第7张图片

4 项目实施

4.1 构建动态代理IP池

    下面这个框架是小落罗列的三类IP接入方式。其中,筛选队列——从各代理网站爬取的免费代理质量较差,需要利用第三方站点进行测试,提取通过测试的IP进入中转队列;中转队列——向请求队列补充IP,保证请求队列的资源充足;请求队列——用于向目标站点发出请求;废弃队列——储存目标站点请求失败的IP,作为筛选排重条件。
【Python-爬虫】某城租房数据全量采集项目_第8张图片

小落从西刺、快代理资源搭建了两个代理IP池,链接:
https://github.com/lda188/my-data/blob/master/xici_mypool.py
https://github.com/lda188/my-data/blob/master/kuai_ip.py

4.2 获取深层URL

    先通过目标站点首页,得到站点服务的所有城市编码idl,利用城市编码构建各城市的站点url向下赚取城市辖区的url—url_1.也就是爬虫机器人的接入端:深层url队列,结果如下图示:
【Python-爬虫】某城租房数据全量采集项目_第9张图片

4.3 数据采集规则

    准确来说,站点的页面数据字段被放在HTML的不同标签下,他们可能是兄弟节点,也可能是并列交错的节点。针对住房位置、交通情况、房间类型、房屋面积、月租价格等不同的数据,编写了相应的方法实现。
【Python-爬虫】某城租房数据全量采集项目_第10张图片

4.4 组装爬虫机器人

4.4.1 本项目的探索

    将数据采集规则和动态代理IP结合,组件爬虫机器人,实现网页数据的自动化采集。最后的爬虫启动后获得结果如下图示:

    在遍历结构中接入Room_page__(url)函数,便可以实现动态IP的接入。
【Python-爬虫】某城租房数据全量采集项目_第11张图片
    数据储存到MySQL:
【Python-爬虫】某城租房数据全量采集项目_第12张图片

4.4.1 需要注意

    爬虫最重要的难点之一是能够不被目标站点拒绝访问,这点在本项目探索中已经解决了。但到目前为止,并没有将整个机器人投入到某城租房数据的全量爬取中去,只是进行理论上的探索与验证。某城租房数据的量特别庞大,只是上面验证的技术肯定跑不下来,效率也会非常低,当然可以考虑用多线程分布式爬虫框架实现。小落只有一台破旧的笔记本,首先设备这块就不太支持啊,所以就没有挑战了,有条件的你可以试试。

5 小结

    本次项目探索得到有哪些成果呢?1.基于西刺代理、宽代理搭建了两个动态IP代理池;2.探索了某城时下的网页数据采集规则;3.组装了一个单线程爬虫机器人。当然,还有某城不同城市不同辖区的网页编码数据。
    本文中的技术只限于爬虫思路的具体探索以及少量数据的爬取。若需要全量爬取,需要在设备资源支持的条件下结合本文的爬虫逻辑搭建多线程爬虫,可高效实现。

你可能感兴趣的:(Python,项目-分析-报告,Pytohn,爬虫,mysql)