第一节–理解网络爬虫
一.爬虫的定义
网络爬虫
是一种按照一定的规则自动地抓取网络信息的程序或者脚本。简单来说,网络爬虫
就是根据一定的算法实现编程开发,主要通过URL实现数据的抓取和发掘
传统的爬虫有百度,Google等搜索引擎,这类通用的搜索引擎都有自己的核心算法。但是,这类通用的搜索引擎也存在着一定的局限性:
- 不同的搜索引擎对于同一个搜索会有不同的结果,搜索出来的结果未必是用户所需的信息
- 通用的引擎扩大网络覆盖率,但有限的搜索引擎服务器资源预无限的网络数据资源之间的矛盾将进一步加深
- 随着网络上数据形式繁多和网络技术不断发展,图片,数据库,音频,视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能无力,不能很好地发现和获取
二.爬虫的类型
网络爬虫根据系统结构和开发技术大致可分分为4种类型:通用网络爬虫,聚焦网络爬虫,增量式网络爬虫和深层网络爬虫
通用网络爬虫
通用网络爬虫又称全网爬虫,常见的有百度,Google等搜索引擎,爬行对象从一些初始URL扩充到整个网站,主要为门户站点搜索引擎和大型网站服务采集数据,具有以下特点:
- 由于商业原因,引擎的算法是不会对外公布的
- 这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,爬行页面的顺序要求相对较低
- 待刷新的页面太多,通常采用并行工作方式,但需要较长的时间才能刷新一次页面
- 存在一定缺陷,通用网络爬虫适用于为搜索引擎搜索广泛的需求
聚焦网络爬虫
聚焦网络爬虫又称主题网络爬虫,是选择性地爬行根据需求的主题相关页面的网络爬虫。与通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,不需要广泛地覆盖无关的网页,很好地满足一些特定人群对特定领域信息的需求
增量式网络爬虫
增量式网络爬虫是指对已下载网页采取增量式更新和只爬行新产生或者已经发生变化的网页的爬虫,它能够在一定程度上保证所爬行的页面尽可能是新的页面
深层网络爬虫
深层网络爬虫是大部分内容不能通过静态URL获取的,隐藏在搜索表单后的,只有用户提交一些关键词才能获得的网络页面。例如
某些网站需要用户登录或者通过提交表单实现提交数据
这4类类型的爬虫大致上又可以分为两类,就是通用爬虫和聚集爬虫,其中聚焦网络爬虫,增量式网络爬虫和深层网络爬虫可以通俗地归纳为一类,因为这类爬虫都是定向爬取数据。相比于通用爬虫,这类爬虫比较有目的性,也就是网络上经常说的网络爬虫,而通用爬虫在网络上通常称为搜索引擎
三.爬虫的原理
通用网络爬虫的实现原理及过程如下图:
通用网络爬虫的实现原理:
- 获取初始的URL。初始的URL地址可以人为地指定,也可以由用户指定的某个或某几个初始爬取网页决定
- 根据初始的URL爬取页面并获得新的URL。获得初始的URL地址之后,先爬取当前URL地址中的网页信息,然后解析网页信息内容,将网页存储到原始数据库中,并且在当前获得的网页信息里发现新的URL地址,存放于一个URL队列里面
- 从URL队列中读取新的URL,从而获得新的网页信息,同时在新网页中获取新URL,并重复上述的爬取过程
- 满足爬虫系统设置的停止条件时,停止爬取。在编写爬虫的时候,一般会设置相应的停止条件,爬虫则会在停止条件满足时停止爬取。如果没有设置停止条件,爬虫就会一直爬取下去,一直到无法获取新的URL地址为止
聚焦网络爬虫的执行原理和过程与通用爬虫大致相同,在通用爬虫的基础上增加两个步骤:定义爬取目标和筛选过滤URL,原理如下图
聚焦网络爬虫的实现原理:
- 制定爬取的方案。在聚集网络爬虫中,首先要依据需求定义聚焦网络爬虫爬取的目标以及整体的爬取方案
- 设定初始的URL
- 根据初始的URL抓取页面,并获取新的URL
- 从新的URL中过滤与需求无关的URL,将过滤后的URL放到URL队列中
- 在URL队列中,根据搜索算法确定URL的优先级,并确定下一步要爬取的URL地址。因为聚焦网络爬虫具有目的性,所以URL的爬取顺序不同会导致爬虫的执行效率不同
- 得到新的URL,将新的URL重现上述爬取过程
- 满足系统中设置的停止条件或无法获取新的URL地址时,停止爬行
四.爬虫的搜索策略
1.深度优先搜索
深度优先搜索是在开发爬虫早期使用较多的方法,目的是达到被搜索结构的叶节点(那些不包含任何超级URL的HTML文件)。在一个HTML文件中,当一个URL被选择后,被选URL将执行深度优先搜索,搜索后得到新的HTML文件,再从新的HTML获取新的URL进行搜索,以此类推,不断地爬取HTML中的URL,直到HTML中没有URL为止
深度优先搜索沿着HTML文件中的URL走到不能再深入为止,然后返回到某一个HTML文件,在继续选择该HTML文件中的其他URL。当不再有其他URL可选择时,说明搜索已经结束。其优点是能遍历一个Web站点或深层嵌套的文档集合。缺点是因为Web结构相当深,有可能造成一旦进去再也出不来的情况发生
举个例子:比如一个网站的首页带有很多URL,深度优先通过首页的URL进入新的页面,然后通过这个页面里的URL再进入新的URL,不断地循环下去,直到返回的页面没有URL为止。如果首页有两个URL,选择第一个URL后,生成新的页面就不会返回首页,而是在新的页面选择一个新的URL,这样不停地访问下去
2.宽度优先搜索
宽度优先搜索是搜索完一个Web页面中所有的URL,然后继续搜索下一层,直到底层为止。例如,首页中有3个URL,爬虫会选择其中之一,处理相应的页面之后,然后返回首页在爬取第二个URL,处理相应的页面,最后返回首页爬取第三个URL,处理第三个URL对应的页面
一旦一层上的所有URL都被选择过,就可以开始在刚才处理过的页面中搜索其余的URL,这就保证了对浅层的优先处理。当遇到一个无穷尽的深层分支时,不会导致陷进深层文档中出不来的情况发生。宽度优先搜索策略还有一个优点,能够在两个页面之间找到最短路径
宽度优先搜索策略通常是实现爬虫的最佳策略,因为它容易实现,而且具备大多数期望的功能。但是如果要遍历一个指定的站点或者深层嵌套的HTML文件集,用宽度优先搜索策略就需要花费较长时间才能到达最底层
3.聚焦爬虫的爬行策略
聚焦爬虫的爬行策略只跳出某个特定主题的页面,根据"最好优先原则"进行访问,快速,有效地获得更多与主题相关的页面,主要通过内容与Web的URL结构指导进行页面的抓取
五.反爬虫技术及解决方案
不同类型的网站都有不一样的反爬虫机制,判断一个网站是否有反爬虫机制需要根据网站设计架构,数据传输方式和请求方式等各个方面评估。下面列出常用的反爬虫技术:
- 用户请求的Headers
- 用户操作网站行为
- 网站目录数据加载方式
- 数据加密
- 验证码识别
网站设置反爬机制不代表不能爬取数据,正如"你有张良计,我有过墙梯",每种反爬虫机制都有对应的解决方案
1.基于用户请求的Headers
从用户请求的Headers
反爬虫是最常见的反爬虫策略。很多网站会对Headers
的User-Agent
进行检测,还有一部分网站会对Referer
进行检测(一些资源网站的防盗链就是检测Referer
)。如果遇到了这类反爬虫机制,就可以在爬虫代码中添加Headers请求头,将浏览器的请求信息以字典的数据格式写入爬虫的请求头。对于检测Headers的反爬虫,在爬虫发送请求中修改或者添加Headers就能很好地解决
2.基于用户操作网站行为
通过检测用户行为来判断用户行为是否合规,例如同一IP
短时间内多次访问同一页面或者同一账户短时间内多次进行相同操作。遇到用户检测行为判断这种情况,可使用IP
代理,IP
可以在IP
代理平台上通过API接口获取,每请求几次更换一个IP
3.基于网站目录数据加载
上述几种情况大多都出现在静态页面,还有一部分网站是由Ajax通过访问接口的方式生成数据加载到网页。遇到这样的情况,首先分析网站设计,找到Ajax请求,分析具体的请求参数和响应的数据结构及其含义,在爬虫中模拟Ajax请求,就能获取所需数据
4.基于数据加密
这种情况可先找到加密代码,加密代码主要是使用JavaScript实现的,分析代码的加密方式,然后在爬虫代码中模拟其加密处理,再发送请求
5.基于验证码识别
最有效的反爬虫技术就是验证码,目前对复杂的验证码还没有做到很好地识别验证,只能通过第三方平台处理或者OCR技术识别
六.本节小结
网络爬虫的类型理论上分为4类,但实际上可以分为两大类:通用爬虫和聚焦爬虫。通用爬虫主要由Google,百度等搜索引擎,主要以核心算法为主导,学习成本相对较高。聚焦爬虫就是定向爬取数据,是有目的性的爬虫,学习成本相对较低