版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一篇文章了解爬虫技术现状 岂安低调分享干货观点案例资讯我们本文全面的分析了爬虫的原理、 技术现状、以及目前仍面临的问题。如果你没接触过爬虫, 本文很适合你,如果你是一名资深的虫师,那么文末的彩蛋 你可能感兴趣。需求万维网上有着无数的网页,包含着海量的信息,无孔不入、 森罗万象。但很多时候,无论出于数据分析或产品需求,我 们需要从某些网站,提取出我们感兴趣、有价值的内容,但 是纵然是进化到21世纪的人类,依然只有两只手,一双眼, 不可能去每一个网页去点去看,然后再复制粘贴。所以我们 需要一种能自动获取网页内容并可以按照指定规则提取相 应内容的程序,这就是爬虫。原理传统爬虫从一个或若干初始网页的U
2、RL开始,获得初始网 页上的URL,在抓取网页的过程中,不断从当前页面上抽取 新的URL放入队列,直到满足系统的一定停止条件。聚焦爬 虫的工作流程较为复杂,需要根据一定的网页分析算法过滤 与主题无关的链接,保留有用的链接并将其放入等待抓取的 URL队列。然后,它将根据一定的搜索策略从队列中选择下 一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统 存贮,进行一定的分析、过滤,并建立索引,以便之后的查 询和检索;所以一个完整的爬虫一般会包含如下三个模块: 网络请求模块爬取流程控制模块内容分析提取模块网络请 求我们常说爬虫其实就是一堆的htt
3、p(s)请求,找到待爬取的链 接,然后发送一个请求包,得到一个返回包,当然,也有 HTTP 长连接(keep-alive)或 h5 中基于 stream 的 websocket 协议,这里暂不考虑,所以核心的几个要素就是:url请求 header、body 响应 herder、内容 01URL爬虫开始运行时需要一个初始url然后会根据爬取到的html 文章,解析里面的链接,然后继续爬取,这就像一棵多叉树, 从根节点开始,每走一步,就会产生新的节点。为了使爬虫 能够结束,一般都会指定一个爬取深度(Depth)o02Http请求http请求信息由请求方法(method)、请求头(headers)、
4、请求 正文(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本文不会解释各个字段的意思,详
5、细的解 释请移步 w3c Http Header Field Definitions。对于爬虫需 要注意的是请求方法是post时,需要将请求的参数先进行 urlencode后再发送,后台收到请求信息后可能会做一些校 验,这可能会影响到爬取,相关的header字段如下:Basic Auth这是一种古老的、不安全的用户验证方式,一般会有用 户授权的限制,会在headers的Autheration字段里要求加 入用户名密码(明文),如果验证失败则请求就会失败,现在 这种认证方式正在被淘汰。Referer链接的来源,通常在访 问链接时,都要带上Referer字段,服务器会进行来源验证, 后台通常会用此
6、字段作为防盗链的依据。User-Agent后台通 常会通过此字段判断用户设备类型、系统以及浏览器的型号 版本。有些编程语言包里网络请求会自定义User-Agent,可 以被辨别出来,爬虫中可以设置为浏览器的ua。Cookie - 般在用户登录或者某些操作后,服务端会在返回包中包含 Cookie信息要求浏览器设置Cookie,没有Cookie会很容易 被辨别出来是伪造请求;也有本地通过JS,根据服务端返回 的某个信息进行处理生成的加密信息,设置在Cookie里面; JavaScript加密操作在进行敏感数据传输时,一般都会通过 javascript进行加密,例如qq空间就会对用户登陆密码进行 R
7、SA加密后再发送给服务器,因此,爬虫在模拟登陆时需要 自己去请求公钥,然后加密。自定义字段因为http的headers 可以自定义地段,所以第三方可能会加入了一些自定义的字 段名称或者字段值,这也是需要注意的。流程控制所谓爬取流程,就是按照什么样的规则顺序去爬。在爬取任 务不大的情况下,爬取的流程控制不会太麻烦,很多爬取框 架都已经帮你做了如scrapy,只需要自己实现解析的代码。 但在爬取一些大型网站时,例如全网抓取京东的评论,微博 所有人的信息,关注关系等等,这种上十亿到百亿次设置千 亿次的请求必须考虑效率,否则一天只有86400秒,那么一 秒钟要抓100次,一天也才8640w次请求,也需
8、要100多 天才能到达十亿级别的请求量。涉及到大规模的抓取,一 定要有良好的爬虫设计,一般很多开源的爬虫框架也都是有 限制的,因为中间涉及到很多其他的问题,例如数据结构, 重复抓取过滤的问题,当然最重要的是要把带宽利用满,所 以分布式抓取很重要,这时流程控制就会很重要。分布式 最重要的就是多台机器不同线程的调度和配合,通常会共享 一个url队列,然后各个线程通过消息通信,如果想要抓的 越多越快,那么对中间的消息系统的吞吐量要求也越高。现在也有一些开源的分布式爬取框架如scrapy-redis就是一 个重写了 scrapy的调度模块、队列、管道的包,redis数据 库是用来在分布式中做请求队列共
9、享,scrapyd是用来部署 scrapy的,scrapyd-api用来启动获取数据。内容分析提取 请求headers的Accept-Encoding字段表示浏览器告诉服务 器自己支持的压缩算法(目前最多的是gzip),如果服务器 开启了压缩,返回时会对响应体进行压缩,爬虫需要自己解 压;过去我们常需要获取的内容主要来源于网页html文档本身, 也就是说,我们决定进行抓取的时候,都是html中包含的内 容,但是随着这几年web技术飞速的发展,动态网页越来越 多,尤其是移动端,大量的SPA应用,这些网站中大量的 使用了 ajax技术。我们在浏览器中看到的网页已不全是html 文档说包含的,很多都
10、是通过javascript动态生成的,一般 来说,我们最终眼里看到的网页包括以下三种:Html文档本 身包含内容这种情况是最容易解决的,一般来讲基本上是静态网页已经 写死的内容,或者动态网页,采用模板渲染,浏览器获取到 HTML的时候已经是包含所有的关键信息,所以直接在网页 上看到的内容都可以通过特定的HTML标签得到。这种情况 解析也是很简单的,一般的方法有一下几种:CSS选择器XPATH (这个值得学习一下)正则表达式或普 通字符串查找JavaScript代码加载内容一般来说有两种情况: A 一种情况是在请求到html文档时,网页的数据在js代码 中,而并非在html标签中,之所以我们看到
11、的网页是正常的,那是因为,其实是由于执行js代码动态添加到标签里面的, 所以这个时候内容在js代码里面的而js的执行是在浏览器 端的操作,所以用程序去请求网页地址的时候,得到的 response是网页代码和js的代码,所以自己在浏览器端能 看到内容,解析时由于js未执行,肯定找到指定HTML标签 下内容肯定为空,如百度的主页就是这种,这个时候的处理 办法,一般来讲主要是要找到包含内容的js代码串,然后通 过正则表达式获得相应的内容,而不是解析HTML标签。B 另一种情况是在和用户交互时,JavaScript可能会动态生成 一些dom,如点击某个按钮弹了一个对话框等;对于这种情 况,一般这些内容
12、都是一些用户提示相关的内容,没什么价 值,如果确实需要,可以分析一下js执行逻辑,但这样的情 况很少。Ajax / Fetch异步请求这种情况是现在很常见的,尤其是在内容以分页形式显示在 网页上,并且页面无刷新,或者是对网页进行某个交互操作 后,得到内容。对于这种页面,分析的时候我们要跟踪所有 的请求,观察数据到底是在哪一步加载进来的。然后当我们 找到核心的异步请求的时候,就只需抓取这个异步请求就可 以了,如果原始网页没有任何有用信息,也没必要去抓取原 始网页了。爬虫技术的现状01语言理论上来说,任何支持网络通信的语言都是可以写爬虫的, 爬虫本身虽然语言关系不大,但是,总有相对顺手、简单的。
13、目前来说,大多数爬虫是用后台脚本类语言写的,其中 python无疑是用的最多最广的,并且页诞生了很多优秀的库 和框架,如 scrapy、BeautifulSoup 、 pyquery、Mechanize 等。但是一般来说,搜索引擎的爬虫对爬虫的效率要求更高, 会选用c+、java、go(适合高并发),详情排名前50的开源 Web爬虫用于数据挖掘。我在大学时代就用c+实现了 一个 多线程的框架,但是发现和python实现的爬虫效率提升并 不明显,原因是,对于简单爬虫,瓶颈在于数据分析及提取, 而网络效率和语言关系并不大。值得一提的是,在近几年 node发展非常快,使得javascript遍地开花
14、,有些人也开 始尝试用node做爬虫,但是,这其实和其它后台脚本语言 没什么区别,也不如python简单,因为你依旧不能在node 里发起ajax请求,不能执行原网页的dom。因为node的 javascript执行环境和浏览器的执行环境并不相同。那么, 难道就真的不能像在浏览器中一样用js写爬虫,用jquery 提取内容吗?想法很大胆,我们暂且搁置。02运行环境爬虫本身不区分到底是运行在windows还是Linux,又或是 OSX,但从业务角度讲,我们把运行在服务端(后台)的,称 之为后台爬虫。而现在,几乎所有的爬虫都是后台爬虫。后台爬虫的三大问题后台爬虫在大行其道的时候,也有着些许棘手的、
15、到目前也 没有什么好的解决方案问题,而归根结底,这些问题的根本 原因是由于后台爬虫的先天不足导致,在正式讨论之前,我 们先思考一个问题,“爬虫和浏览器有什么异同?” 01相同点本质上都是通过http/https协议请求互联网数据02不同点爬虫一般为自动化程序,无需用用户交互,而浏览器不是; 运行场景不同;浏览器运行在客户端,而爬虫一般都跑在服 务端;能力不同;浏览器包含渲染引擎、javascript虚拟机, 而爬虫一般都不具备这两者。了解了这些,我们再来看看后 台面临的问题:01问题一:交互问题有些网页往往需要和用户进行一些交互,进而才能走到下一 步,比如输入一个验证码,拖动一个滑块,选几个汉
16、字。网 站之所以这么做,很多时候都是为了验证访问者到底是人还 是机器。而爬虫程序遇到这种情况很难处理,传统的简单 图片验证码可以通过图形处理算法读出内容,但是随着各种 各样,花样百出,人神共愤的、变态的验证码越来越多(尤 其是买火车票时,分分钟都想爆粗口),这个问题就越来越 严重。02问题二:Javascript解析问题如前文所述,javascript可以动态生成dom。目前大多数网 页属于动态网页(内容由javascript动态填充),尤其是在移动端,SPA/PWA应用越来越流行,网页中大多数有用的数 据都是通过ajax/fetch动态获取后然后再由js填充到网页dom树中,单纯的html静
17、态页面中有用的数据很少。目前 主要应对的方案就是对于js ajax/fetch请求直接请求 ajax/fetch的url,但是还有一些ajax的请求参数会依赖一 段javascript动态生成,比如一个请求签名,再比如用户登 陆时对密码的加密等等,如果一昧的去用后台脚本去干javascript本来做的事 这就要清楚的理解原网页代码逻辑, 但是,更致命的是,有些javascript可以做的事爬虫程序是而这不仅非常麻烦,而且会使你的爬取代码异常庞大臃肿。很难甚至是不能模仿的,比如有些网站使用拖动滑块到某个 位置的验证码机制,这就很难再爬虫中去模仿。其实,总 结一些,这些弊端归根结底,是因为爬虫程序并非是浏览器, 没有javascript解析引擎所致。针对这个问题,目前主要的 应对策略就是在爬虫中引入Javascript引擎 如PhantomJS, 但是又有着明显的弊端,如服务器同时有多个爬取任务时, 资源占用太大。还有就是,这些无窗口的javascript引擎很多时候使用起来并不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 长治市潞城市2025届三年级数学第二学期期中学业水平测试试题含答案
- 长武县2025届四年级数学第二学期期末统考模拟试题含解析
- (2026年)学校消防的演练总结
- (2026版)学校消防安全工作总结
- 长岛县2025-2026学年数学三年级上学期期中监测试题(含答案解析)
- 2025年重庆市铜梁区数学中考二模
- 广东省珠海市文园中学(集团)2024-2025学年九年级上学期语文11月期中试卷(解析版)
- 某皮革厂皮革染色操作办法
- 部队特岗面试题及答案
- 能力验证考试题及答案
- 河南省许昌平顶山2026届高一数学第二学期期末质量检测试题含解析
- 医院五年人力资源发展规划
- 2025年高级卫生专业技术资格考试微生物检验技术试卷及答案
- 硝铵(CAS号:6484-52-2)理化性质与危险特性一览表
- PLC应用技术(三菱 第二版)课件:PLC基础知识
- 2025年电力行业自主人才评价考评员考试题库
- VDI-2230高强度螺栓连接的系统计算-中文版
- 环氧地坪旧地面翻新施工方案
- 气瓶维修回收合同范本
- 2025年初级会计职称《经济法基础》精讲课件第1-4章
- 认证风险的管理制度
评论
0/150
提交评论