爬虫:请求网站并提取数据的自动化程序
百科:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,
沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序;
从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据,存放起来使用;
问:为什么我抓到的和浏览器看到的不一样?
答:网页通过浏览器的解析,加载CSS与JS等文件对网页进行解析渲染,达到我们看到绚丽的网页,而我们抓到的文件只是一些代码,css文件无法调用,使得样式不能表现出来,那么网页就会出现错位等等问题。
问:怎样解决JavaScript渲染的问题?
答:分析Ajax请求、Selenium/WebDriver、Splash、PyV8、Ghost.py等库
优秀爬虫的特性对于不同的应用来说,可能实现的方式各有差异,但是实用的爬虫都应该具备以下特性。
互联网的网页数量是海量的。所以爬虫的性能至关重要,这里的性能主要是指爬虫下载网页的抓取速度,常见的评价方式是以爬虫每秒能够下载的网页数量作为性能指标,单位时间能够下载的网页数量越多,爬虫的性能越高。
要提高爬虫的性能,在设计时程序访问磁盘的操作方法及具体实现时数据结构的选择很关键,比如对于待抓取URL队列和已抓取URL队列,因为URL数量非常大,不同实现方式性能表现迥异,所以高效的数据结构对于爬虫性能影响很大。
即使单个爬虫的性能很高,要将所有网页都下载到本地,仍然需要相当长的时间周期,为了能够尽可能缩短抓取周期,爬虫系统应该有很好地可扩展性,即很容易通过增加抓取服务器和爬虫数量来达到此目的。
目前实用的大型网络爬虫一定是分布式运行的,即多台服务器专做抓取,每台服务器部署多个爬虫,每个爬虫多线程运行,通过多种方式增加并发性。对于巨型的搜索引擎服务商来说,可能还要在全球范围、不同地域分别部署数据中心,爬虫也被分配到不同的数据中心,这样对于提高爬虫系统的整体性能是很有帮助的。
爬虫要访问各种类型的网站服务器,可能会遇到很多种非正常情况,比如网页HTML编码不规范, 被抓取服务器突然死机,甚至爬虫陷阱等。爬虫对各种异常情况能否正确处理非常重要,否则可能会不定期停止工作,这是无法忍受的。
从另外一个角度来讲,假设爬虫程序在抓取过程中死掉,或者爬虫所在的服务器宕机,健壮的爬虫应能做到,再次启动爬虫时,能够恢复之前抓取的内容和数据结构,而不是每次都需要把所有工作完全从头做起,这也是爬虫健壮性的一种体现。
爬虫的友好性包含两方面的含义:一是保护网站的部分私密性,另一是减少被抓取网站的网络负载。爬虫抓取的对象是各类型的网站,对于网站所有者来说,有些内容并不希望被所有人搜到,所以需要设定协议,来告知爬虫哪些内容是不允许抓取的。目前有两种主流的方法可达到此目的:爬虫禁抓协议和网页禁抓标记。
爬虫禁抓协议指的是由网站所有者生成一个指定的文件robot.txt,并放在网站服务器的根目录下,这个文件指明了网站中哪些目录下的网页是不允许爬虫抓取的。具有友好性的爬虫在抓取该网站的网页前,首先要读取robot.txt文件,对于禁止抓取的网页不进行下载。
网页禁抓标记一般在网页的HTML代码里加入meta name="robots”标记,content字段指出允许或者不允许爬虫的哪些行为。可以分为两种情形,一种是告知爬虫不要索引该网页内容,以noindex作为标记;另外一种情形是告知爬虫不要抓取网页所包含的链接,以nofollow作为标记。通过这种方式,可以达到对网页内容的一种隐私保护。
遵循以上协议的爬虫可以被认为是友好的,这是从保护私密性的角度来考虑的。另外一种友好性则是,希望爬虫对某网站的访问造成的网路负载较低。爬虫一般会根据网页的链接连续获取某网站的网页,如果爬虫访问网站频率过高,会给网站服务器造成很大的访问压力,有时候甚至会影响网站的正常访问,造成类似DOS攻击的效果,为了减少网站的网络负载,友好性的爬虫应该在抓取策略部署时考虑每个被抓取网站的负载,在尽可能不影响爬虫性能的情况下,减少对单一站点短期内的高频访问。