1 什么是网络爬虫
爬虫的简单定义
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
简单来说:使用事先写好的程序去抓取网络上所需要的数据,这样的程序就叫网络爬虫。
爬虫的分类
网络爬虫可以分为通用网络爬虫(如搜索引擎的爬虫,根据几个URL的种子不断的去抓取数据)和聚焦网络爬虫(有选择性的抓取预先定义好的主题和相关页面的网络爬虫)。
A.通用网络爬虫:
搜索引擎
B.聚焦网络爬虫:
针对某一特定领域的数据进行抓取的程序。飞猪、携程的行程信息,天眼查的企业信息等。
2 为什么需要爬虫
爬虫的用途
A.解决冷启动问题:
一些论坛的假用户
B.搜索引擎的根基:
做搜索引擎少不了爬虫程序;
C.建立起知识图谱,帮助建立机器学习的训练集:
维基百科是一个较好的数据集来源;
D.可以制作各种商品的比价,趋势分析等;
E.其他:
比如分析淘宝上竞争对手的数据;分析微博的数据传递影响力,政府的舆情分析,分析人与人之间的关系等等。
总之一句话:在当今的大数据时代,做任何价值分析的前提是数据,而爬虫则是获得这个前提的一个低成本高收益手段。
怎么做爬虫
Python 、node 、java
初级爬虫工程师:
1.Web前端的知识:HTML,CSS,JavaScript,DOM,DHTML,Ajax,jQuery,json等;
2.正则表达式,能提取正常一般网页中想要的信息,比如某些特殊的文字,链接信息,知道什么是懒惰,什么是贪婪型的正则;
3.会使用re,cheerio,XPath等获取一些DOM结构中的节点信息;
4.知道什么是深度优先,广度优先的抓取算法,及实践中的使用规则;
5.能分析简单网站的结构。
中级爬虫工程师:
1.了解什么是Hash,会使用简单的MD5,SHA1等算法对数据进行Hash以便存储;
2.熟悉HTTP,HTTPS协议的基础知识,了解GET,POST方法,了解HTTP头中的信息,包括返回状态码,编码,user-agent,cookie,session等;
3.能设置User-Agent进行数据爬取,设置代理等;
4.知道什么是Request,什么是Response,会使用Fiddler, Wireshark等工具抓取及分析简单的网络数据包;对于动态爬虫,要学会分析Ajax请求,模拟制造Post数据包请求,抓取客户端session等信息,对于一些简单的网站,能够通过模拟数据包进行自动登录;
5.对于比较难搞定的网站,学会使用浏览器+selenium抓取一些动态网页信息;
6.并发下载,通过并行下载加速数据抓取;多线程的使用。
高级爬虫工程师:
……
3 爬虫的合法性问题
目前还处于不明确的蛮荒阶段,“允许哪些行为”这种基本秩序还处于建设中。至少目前来看,如果抓取的数据为个人所用,则不存在问题;如果数据用于转载,那么抓取数据的类型就很重要了:一般来说,当抓取的数据是实现生活中的真实数据(比如,营业地址,电话清单)时,是允许转载的,但是,如果是原创数据(比如,意见或评论),通常就会受到版权限制,而不能转载。(知乎的复制会粘贴上版权信息,都是爬虫可以轻松拿到干净的数据)
注意:不管怎么样,作为一个访客,应当约束自己的抓取行为,这就是说要求下载请求的速度需要限定在一个合理值之内(对别人服务器和维护人员的同情),并且还需要设定一个专属的用户代理来标识自己。
4 爬虫的准备工作:网站的背景调研
网站的背景调研对聚焦的网络爬虫而言至关重要,正所谓:知己知彼,百战不殆。
robots协议
识别网站用了何种技术
找网站的所有者
5爬虫的实现
插入企查查案例
总结:一个通用爬虫的流程如下:
设置种子站点
获取网站信息
错误处理及日志记录
6 数据的类型
网页中数据的类型简单来说可以分成以下三类:结构化数据、半结构化数据和非结构化数据。
7 怎么提取网页中的信息
XPath
选取节点
正则表达式re
被用来检索\替换那些符合某个模式(规则)的文本,对于文本过滤或规则匹配,最强大的就是正则表达式,是python爬虫里必不可少的神兵利器。
8 动态网页的使用场景
先看下面一个例子:
这是京东上看一本书的场景。我们发现打开一本书之后,书的价格,排名等信息及书的评论信息不是在我们第一次打开网站时就立即加载进来的。而是通过二次请求或多次的异步请求获取的。这样的页面就是动态页面。
关于动态页面使用的场景:
希望异步刷新的场景。有些网页内容很多,一次加载完对服务器压力很大,而且有的用户不会去查看所有内容;
GET方法
POST方法
更加难以对付的动态网站
1. 应对需要多次数据的交互模拟的网站
我们有时会遇到像淘宝这样的大型网站,对数据版权看得特别重的,它们的网站有大量的工程师和技术人员去维护,它们也可能在技术手段上采用多次交互数据包的方式来完成网站服务器与用户浏览器之间的交互。如果此时还采用传统的分析数据包的方式会比较的复杂,难度较高。那么,有没有一劳永逸的方法,来解决此类问题呢?
我们的解决方案是:Selenium + PhantomJS。
我们的爬虫其实就是在做模拟浏览器的行为。
2.Electron
Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。
3. PhantomJS
一个基于webkit无界面(headless)的浏览器,它可以把网站加载到内存中并执行页面上的JS,但它没有图形用户界面,所以耗费的资源比较少;
关于动态网站信息抓取的总结
总的来说,我们的爬虫要尽量模拟的看起来就像是真正的用户在浏览器上访问服务器网站的行为。如果我们使用GET或POST的方式来模拟浏览器与服务器间通信的行为,成本比较低,但是应对复杂的网站或者服务器精心防御的网站来说是很难骗过服务器的。Electron+PhantomJS的方案则会让我们的程序看起来更像是普通的用户,但是它的效率相对而言会降低很多,速度也会慢很多。在大规模爬去数据时可能遇到许多新的挑战。(比如网站尺寸的设置,等待时间的设定等)
Cookie 、session、
终极武器
浏览器事件: goto,back,forward,refresh,
用户事件: click,mousedown,mouseup,mouseover,type,insert,select,check,uncheck,selectscrollTo
向网页注入脚本: .js .css的文件类型原理是跟油猴差不多,可以编写自己的js代码注入十分方便
wait 函数可以按照延迟时间或者一个 dom 元素的出现
evaluate 以浏览器的环境运行的脚本函数,然后返回一个 promise 函数
需要加载全网站,一般无防护网站没必要。
9高效率的爬取数据
人多力量大,多人干事更快。多个爬虫一起干活效率也更高。
随着爬虫抓取数据的提速,及数据量抓取的庞大,问题也会凸显。对方也会尝试用各种手段来禁止爬虫的行为。
10反爬及应对反爬的策略
随着抓取的数据量到一定程度,数据重复及爬取过程中的死链问题会凸显。怎么来解决反爬问题呢?
网站如何发现爬虫
一般来说,网站会有以下一些简单的策略发现爬虫程序:
1)单一IP非常规的访问频次;
2)单一IP非常规的数据流量;
3)大量重复简单的网站浏览行为,只下载网页,没有后续的JS,CSS请求;
5)通过一些陷阱来发现爬虫,例如一些通过CSS对用户隐藏的链接,只有爬虫才会访问;
网站如何进行反爬
一般来说网站会采用下面两个简单的策略来防止爬虫:
1.大量使用动态网页,是的爬虫的爬取难度增加,重要数据都拿不到,即使爬虫采用了Web环境来渲染(内置浏览器),也会大大增加爬虫的负担和爬虫时间;(当然,采用动态加载的技术,对服务器的负担也会大大减轻)
2.基于流量的拒绝:开启带宽限制模块,限制每个IP最多连接数,最大带宽等;
爬虫如何发现自己可能被网站识别了
如果爬取过程中出现以下情况,那么小心了,你的爬虫可能被网站发现了:
1.验证码出现;
2.Unusual content delivery delay 非常规的延时;
3.Frequent response with HTTP 403, 404, 301 or 50x error;
4.直接接口返回骂人的话……
爬虫应对反爬的策略
我们可以从以下几个方面来考虑应对反爬:
1)User-Agent池;
2)IP代理服务器池;
3)CookieJar等的管理;
4)协议的细节考虑,如:需要大量的实践经验总结的
抓取数据时不处理CSS,JS等;
nofollow属性;css的display属性;探测陷阱;
验证refer locator等;
5)使用分布式的多机策略;爬慢点,把爬虫放到访问频繁的主站IP子网下,如教育网;
6)使用了规则来批量爬取,需对规则进行组合;
7)验证码的搞定:机器学习,图像识别;
8)尽可能遵守Robots协议;
9)与所有方协调接口与时间段;
灰色地带
token
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。