一篇文章了解爬虫技术现状 岂安低调分享
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一篇文章了解爬虫技术现状岂安低调分享
干货观点案例资讯我们本文全面的分析了爬虫的原理、技术现状、以及目前仍面临的问题。如果你没接触过爬虫,本文很适合你,如果你是一名资深的虫师,那么文末的彩蛋你可能感兴趣。
需求
万维网上有着无数的网页,包含着海量的信息,无孔不入、森罗万象。但很多时候,无论出于数据分析或产品需求,我们需要从某些网站,提取出我们感兴趣、有价值的内容,但是纵然是进化到21世纪的人类,依然只有两只手,一双眼,不可能去每一个网页去点去看,然后再复制粘贴。所以我们需要一种能自动获取网页内容并可以按照指定规则提取相
应内容的程序,这就是爬虫。
原理
传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的
某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;所以一个完整的爬虫一般会包含如下三个模块:网络请求模块爬取流程控制模块内容分析提取模块网络请
求
我们常说爬虫其实就是一堆的http(s)请求,找到待爬取的链接,然后发送一个请求包,得到一个返回包,当然,也有HTTP长连接(keep-alive)或h5中基于stream的websocket 协议,这里暂不考虑,所以核心的几个要素就是:url请求header、body响应herder、内容01URL
爬虫开始运行时需要一个初始url,然后会根据爬取到的html 文章,解析里面的链接,然后继续爬取,这就像一棵多叉树,从根节点开始,每走一步,就会产生新的节点。为了使爬虫能够结束,一般都会指定一个爬取深度(Depth)。
02Http请求
http请求信息由请求方法(method)、请求头(headers)、请求正文(body)三部分组成。由于method一般是header中的第一行,也可以说请求头中包含请求方法,下面是chrome访问请求头的一部分:GET /
HTTP/1.1Connection:Keep-AliveHost:Use r-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/55.0.2883.95 Safari/537.36Accept-Encoding:gzip, deflate, sdch, br 本文不会解释各个字段的意思,详细的解释请移步w3c Http Header Field Definitions 。对于爬虫需要注意的是请求方法是post时,需要将请求的参数先进行urlencode后再发送,后台收到请求信息后可能会做一些校验,这可能会影响到爬取,相关的header字段如下:Basic Auth这是一种古老的、不安全的用户验证方式,一般会有用户授权的限制,会在headers的Autheration字段里要求加入用户名密码(明文),如果验证失败则请求就会失败,现在这种认证方式正在被淘汰。Referer链接的来源,通常在访问链接时,都要带上Referer字段,服务器会进行来源验证,后台通常会用此字段作为防盗链的依据。User-Agent后台通常会通过此字段判断用户设备类型、系统以及浏览器的型号版本。有些编程语言包里网络请求会自定义User-Agent,可以被辨别出来,爬虫中可以设置为浏览器的ua。Cookie一般在用户登录或者某些操作后,服务端会在返回包中包含Cookie信息要求浏览器设置Cookie,没有Cookie会很容易被辨别出来是伪造请求;也有本地通过JS,根据服务端返回的某个信息进行处理生成的加密信息,设置在Cookie里面;JavaScript加密操作在进行敏感数据传输时,一般都会通过javascript进行加密,例如qq空间就会对用户登陆密码进行RSA加密后再发送给服务器,因此,爬虫在模拟登陆时需要
自己去请求公钥,然后加密。自定义字段因为http的headers 可以自定义地段,所以第三方可能会加入了一些自定义的字段名称或者字段值,这也是需要注意的。
流程控制
所谓爬取流程,就是按照什么样的规则顺序去爬。在爬取任务不大的情况下,爬取的流程控制不会太麻烦,很多爬取框架都已经帮你做了如scrapy,只需要自己实现解析的代码。但在爬取一些大型网站时,例如全网抓取京东的评论,微博所有人的信息,关注关系等等,这种上十亿到百亿次设置千亿次的请求必须考虑效率,否则一天只有86400秒,那么一秒钟要抓100次,一天也才8640w次请求,也需要100多天才能到达十亿级别的请求量。涉及到大规模的抓取,一定要有良好的爬虫设计,一般很多开源的爬虫框架也都是有限制的,因为中间涉及到很多其他的问题,例如数据结构,重复抓取过滤的问题,当然最重要的是要把带宽利用满,所以分布式抓取很重要,这时流程控制就会很重要。分布式最重要的就是多台机器不同线程的调度和配合,通常会共享一个url队列,然后各个线程通过消息通信,如果想要抓的越多越快,那么对中间的消息系统的吞吐量要求也越高。
现在也有一些开源的分布式爬取框架如scrapy-redis就是一个重写了scrapy的调度模块、队列、管道的包,redis数据库是用来在分布式中做请求队列共享,scrapyd是用来部署
scrapy的,scrapyd-api用来启动获取数据。内容分析提取
请求headers的Accept-Encoding字段表示浏览器告诉服务器自己支持的压缩算法(目前最多的是gzip),如果服务器
开启了压缩,返回时会对响应体进行压缩,爬虫需要自己解压;
过去我们常需要获取的内容主要来源于网页html文档本身,也就是说,我们决定进行抓取的时候,都是html中包含的内容,但是随着这几年web技术飞速的发展,动态网页越来越多,尤其是移动端,大量的SPA应用,这些网站中大量的
使用了ajax技术。我们在浏览器中看到的网页已不全是html 文档说包含的,很多都是通过javascript动态生成的,一般
来说,我们最终眼里看到的网页包括以下三种:Html文档本身包含内容
这种情况是最容易解决的,一般来讲基本上是静态网页已经写死的内容,或者动态网页,采用模板渲染,浏览器获取到HTML的时候已经是包含所有的关键信息,所以直接在网页上看到的内容都可以通过特定的HTML标签得到。这种情况解析也是很简单的,一般的方法有一下几种:
CSS选择器XPATH(这个值得学习一下)正则表达式或普通字符串查找JavaScript代码加载内容一般来说有两种情况:A一种情况是在请求到html文档时,网页的数据在js代码中,而并非在html标签中,之所以我们看到的网页是正常的,