培训计划:
爬虫的概念
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
爬虫的应用场景
- 搜索引擎
爬虫程序可以为搜索引擎系统爬取网络资源,用户可以通过搜索引擎搜索网络上一切所需要的资源。搜索引擎是一套非常庞大且精密的算法系统,搜索的准确性,高效性等都对搜索系统有很高的要求。 - 数据挖掘
爬虫除了用来做搜索外,还可以做非常多的工作,可以说爬虫现在在互联网项目中应用的非常广泛。互联网项目通过爬取相关数据主要进行数据分析,获取价值数据。
爬虫的分类
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的。
1. 通用网络爬虫:
通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低。通用网络爬虫适用于为搜索引擎搜索广泛的主题,有较强的应用价值。
2.聚焦网络爬虫
聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。 和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求
3.增量网络爬虫
增量式网络爬虫(Incremental Web Crawler)是 指 对 已 下 载 网 页 采 取 增 量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面 ,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。
4.Deep Web 爬虫
Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。 表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。
常用的爬虫策略
网页的抓取策略可以分为深度优先、广度优先和最佳优先三种。深度优先在很多情况下会导致爬虫的陷入(trapped)问题,目前常见的是广度优先和最佳优先方法。
- 深度优先策略
这种策略比较适合垂直搜索或站内搜索, 但爬行页面内容层次较深的站点时会造成资源的巨大浪费。 - 广度优先策略
这种策略能够有效控制页面的爬行深度,避免遇到一个无穷深层分支时无法结束爬行的问题,实现方便,无需存储大量中间节点,不足之处在于需较长时间才能爬行到目录层次较深的页面 - 最佳优先搜索
最佳优先搜索策略按照一定的网页分析算法,预测候选URL与目标网页的相似度,或与主题的相关性,并选取评价最好的一个或几个URL进行抓取。它只访问经过网页分析算法预测为“有用”的网页。存在的一个问题是,在爬虫抓取路径上的很多相关网页可能被忽略。
目标页面的分析
1. 非JS渲染出来的页面
像这种后台已经封装好数据并直接返回而且前端不会再做特殊处理的页面,是比较好抓取,可以使用jsoup 或者httpclient等工具直接解析。
2. 使用JS渲染出来的页面
现在js渲染出的页面越来越多。对于爬虫来说,这种页面是比较讨厌的:仅仅提取HTML内容,往往无法拿到有效的信息。目前比较通用的方式有以下两种:
- 使用模拟浏览器工具
在抓取阶段,在爬虫中内置一个浏览器内核,执行js渲染页面后,再抓取。这方面对应的工具有Selenium、HtmlUnit或者PhantomJs。但是这些工具都存在一定的效率问题,同时也不是那么稳定。好处是编写规则同静态页面一样。 - 分析AJAX请求
因为js渲染页面的数据也是从后端拿到,而且基本上都是AJAX获取,所以分析AJAX请求,找到对应数据的请求,也是比较可行的做法。而且相对于页面样式,这种接口变化可能性更小。缺点就是找到这个请求,并进行模拟,是一个相对困难的过程,也需要相对多的分析经验。
3.如何判断前端渲染
判断页面是否为js渲染的方式比较简单,在浏览器中直接查看源码(Windows下Ctrl+U,Mac下command+alt+u),如果找不到有效的信息,则基本可以肯定为js渲染。
可能遇到的防爬虫手段
大部分情况下,反爬虫的需求是不能影响到网站正常使用的,一个网站的功能性需求一定高于反爬虫需求,所以大部分网站反爬虫一定不会恶心到正常用户的使用。
爬取页面过程中可能遇到的防爬虫手段,以及对应的策略:
-
基于请求头做了限制
可以参照目标网站真实的header信息,进行模拟,尤其像User-Agent这样的参数,需要更改,否则请求头的User-Agent则会带着JavaClient过去,基于这一点判断非人类后直接在服务器上封杀。
- 短时间内访问太频繁,IP被封
短时间内大量访问,触发了最大频率限制比如每分钟120次,则对应的IP将被屏蔽,一定时间内(几分钟或者几个小时内)该IP无法再访问目标网站。
解决思路:出现这种情况,可以适当的降低访问频率或者使用代理IP,通过不断的切换代理IP进行访问。 - 需要登录
未登录情况下,无法访问对应的数据,只有登录后才可访问,这种情况,则需要使用模拟登录,获取对应的cookie信息或者token信息,加入到请求信息中,再进行访问。 - 规则时间内,达到某个频率,需要输入验证码,才可继续访问。
这种情况,可以通过频繁的更换代理IP进行访问,或者破解图形验证码。 -
每个请求都需要先通过验证码后才可继续访问。
这种情况得先破解验证码才可继续访问。而破解需要图像识别验证码,自动填写验证,但是现在的情况是 大部分验证码噪声较多复杂度大,对于图像识别不是很熟悉的人很难识别出正确的验证码。解决该问题比较实用的一种方式是接入自动打码平台。
验证码的形式:
不过实际应用的时候,一般大家做到根据 IP 限制频次就结束了,除非很核心的数据,否则不会再进行更多的验证了,毕竟工程的问题一半是成本的问题。
常用的爬虫框架
Nutch
Nutch属于分布式爬虫,爬虫使用分布式,主要是解决两个问题:1)海量URL管理;2)网速。如果要做搜索引擎,Nutch1.x是一个非常好的选择。Nutch1.x和solr或者es配合,就可以构成一套非常强大的搜索引擎,否则尽量不要选择Nutch作为爬虫。用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,往往是单机爬虫所需的十倍时间不止。crawler4j
crawler4j是Java实现的开源网络爬虫。提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫。WebCollector
WebCollector使用了Nutch的爬取逻辑(分层广度遍历),Crawler4j的的用户接口(覆盖visit方法,定义用户操作),以及一套自己的插件机制,设计了一套爬虫内核。WebMagic(支持分布式)
WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则包括一些便利的、实用性的功能。WebMagic的架构设计参照了Scrapy,目标是尽量的模块化,并体现爬虫的功能特点。
其他的java爬虫框架:https://zhuanlan.zhihu.com/p/24844250
后面会着重介绍的框架,实践。
Webmagic
Webmagic的文档:http://webmagic.io/docs/zh/
- Webmaigc的介绍
WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy,但是实现方式更Java化一些。
整体架构:http://webmagic.io/docs/zh/posts/ch1-overview/architecture.html
至于高效部分,一些 Tips:
1.尽量减少请求次数,能抓列表页就不抓详情页
2.不要只看 Web 网站,还有 App 和 H5,他们的反爬虫措施一般比较少
3.如果真的对性能要求很高,可以考虑多线程(一些成熟的框架如 scrapy,webmagic等都已支持),甚至分布式。
爬虫的行为,本质上就是模拟浏览器发送HTTP请求,所以要想在爬虫领域深耕细作,理解 HTTP 协议是必须的。