为什么会有爬虫这个行业?
首先请问:都说现在是"大数据时代"以及"人工智能时代",大数据开发和人工智能都需要大量数据的支持,那数据从何而来?
企业产生的用户数据:百度指数、阿里指数、TBI腾讯浏览指数、新浪微博指数
数据平台购买数据:数据堂、国云数据市场、贵阳大数据交易所
政府/机构公开的数据:中华人民共和国国家统计局数据、世界银行公开数据、联合国数据、纳斯达克。
数据管理咨询公司:麦肯锡、埃森哲、艾瑞咨询
爬取网络数据:如果需要的数据市场上没有,或者不愿意购买,那么可以选择招/做一名爬虫工程师,自己动手丰衣足食。
爬虫是什么?
网络爬虫(Web Spider)又称网络蜘蛛、网络机器人,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫的分类
网络爬虫按照系统结构和实现技术,大致可分为以下集中类型:
- 通用网络爬虫:就是尽可能大的网络覆盖率,如 搜索引擎(百度、雅虎和谷歌等…)。
- 聚焦网络爬虫:有目标性,选择性地访问万维网来爬取信息。
- 增量式网络爬虫:只爬取新产生的或者已经更新的页面信息。特点:耗费少,难度大
- 深层网络爬虫:通过提交一些关键字才能获取的Web页面,如登录或注册后访问的页面。
但是严格意义来讲根据使用场景只有通用爬虫和聚焦爬虫之分
通用网络爬虫
通用网络爬虫是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。通用爬虫把网站的整个页面数据抓取下来,如果网站有js渲染、ajax等技术加载的页面的部分数据是抓不到的,对用户来说通用爬虫抓取的数据80%都是没有的。例子:百度快照
提示:
搜索引擎并不是收录全球所有的网站,被搜索引擎收录的只有20%,80%没有被收录的网站叫深网(Deep Web),深网最底层又有一部分网站叫做暗网,暗网上很多非法交易(如著名的暗网丝绸之路),交易使用的都是比特币,暗网是深网(Deep Web)的一个子集,属于深网的一小部分,大部分深网和暗网走的都是不标准的http和https协议,但是通用爬虫也是可以爬取,只是搜索引擎不知道它们的服务器地址。
通用搜索引擎(Search Engine)工作原理
通用网络爬虫从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。
第一步:抓取网页
搜索引擎网络爬虫的基本工作流程如下:
首先选取一部分的种子URL,将这些URL放入待抓取URL队列;
取出待抓取URL,解析DNS得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中,并且将这些URL放进已抓取URL队列。
分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环....
搜索引擎如何获取一个新网站的URL:
新网站向搜索引擎主动提交网址:(如百度http://zhanzhang.baidu.com/linksubmit/url)
在其他网站上设置新网站外链(尽可能处于搜索引擎爬虫爬取范围)
搜索引擎和DNS解析服务商(如DNSPod等)合作,新网站域名将被迅速抓取。
但是搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或文件的内容,如标注为nofollow的链接,或者是Robots协议。
Robots协议(也叫爬虫协议、机器人协议等),全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,例如:
淘宝网:https://www.taobao.com/robots.txt
腾讯网: http://www.qq.com/robots.txt
第二步:数据存储
搜索引擎通过爬虫爬取到的网页,将数据存入原始页面数据库。其中的页面数据与用户浏览器得到的HTML(网页源代码)是完全一样的。
搜索引擎蜘蛛在抓取页面时,也做一定的重复内容检测,一旦遇到访问权重很低的网站上有大量抄袭、采集或者复制的内容,很可能就不再爬行。
第三步:预处理
搜索引擎将爬虫抓取回来的页面,进行各种步骤的预处理。
- 提取文字
- 中文分词
- 消除噪音(比如版权声明文字、导航条、广告等……)
- 索引处理
- 链接关系计算
- 特殊文件处理
- ....
除了HTML文件外,搜索引擎通常还能抓取和索引以文字为基础的多种文件类型,如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我们在百度或者谷歌搜索结果中也经常会看到这些文件类型。
但搜索引擎还不能处理图片、视频、Flash 这类非文字内容,也不能执行脚本和程序。
第四步:提供检索服务,网站排名
搜索引擎在对信息进行组织和处理后,为用户提供关键字检索服务,将用户检索相关的信息展示给用户。
同时会根据页面的PageRank值(链接的访问量排名)来进行网站排名,这样Rank值高的网站在搜索结果中会排名较前,当然也可以直接使用 Money 购买搜索引擎网站排名,简单粗暴。课外阅读:Google搜索引擎的工作原理
通用性搜索引擎也存在着一定的局限性
通用搜索引擎所返回的结果都是网页,而大多情况下,网页里90%的内容对用户来说都是无用的。
不同领域、不同背景的用户往往具有不同的检索目的和需求,搜索引擎无法提供针对具体某个用户的搜索结果。
万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎对这些文件无能为力,不能很好地发现和获取。
通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询,无法准确理解用户的具体需求。
聚焦爬虫
聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于: 聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
比如:淘宝上的商品信息,我们可以根据业务需求只抓取价格等对我们有用信息,其他无关紧要的信息不抓取(即过滤筛选)
聚焦爬虫是有目标有针对性的抓取数据,而通用爬虫则是所有的都抓取。
爬虫工作原理
爬虫的工作原理很简单一共就分四步,可能有些网站(即爬虫项目需求)不需要四步就能搞定或者更多但是一般爬虫就四步!
第一步 抓取网页
按照自己的需求找到需要抓取的网站。
通过抓包或者其他方式找到需要抓取的数据的url(链接请求)。
用编程语言中爬虫相关的一些库对这个或者这些url链接发送请求就行,不过爬虫得到的结果一般是HTML网页源代码或者json数据,对于图片、视频、音乐等多媒体文件来说爬虫发送请求后得到的是二进制数据流。
第二步 提取相关信息
抓取到网页源代码或者json数据,我们需要通过正则表达式、xpath、css选择器等数据提取库来提取我们需要的数据,对于请求的多媒体文件因为返回的文件二进制流,所以我们可以不用提取,直接保存多媒体文件相应的文件格式就能得到对应的多媒体文件。
第三步 预处理
对于我们提取的数据它可能不干净或者说不是我们想要的格式,这时我们就需要数据预处理,常用的预处理有去空白去换行等等
第四步 数据存储
预处理完数据得到了最终的数据,我们需要把数据存到数据库或者存储为txt、excel、csv、json等格式的文件数据,针对不同的情况我们可以选择不同的存储方式,比如说存到数据库既可以存到sqlserver、mysql等关系型数据库也可以存到mongodb、redis等非关系数据库。
爬虫与黑客的区别
其实爬虫和黑客有本质的区别,爬虫的本质跟正常用户在浏览器访问网站没什么太大区别,只不过是通过程序的方式访问特定的链接目标精确(不需要请求跟目标数据无关的请求),所以速度比正常在浏览器访问要快很多,并且爬虫可以批量访问特定的数据而浏览器不行,对于一些需要登陆或者某些权限才能访问的网站,爬虫也需要账号或者某些权限的支持才能抓取到相关数据,但是黑客技术却不是这样,黑客可以通过黑客技术可能不需要登陆或者获得某些权限就能直接拿到网站数据,还可以拿到网站上看不到的数据。
爬虫跟黑客也有类似的地方,比如爬虫也可以作为一种攻击手段,高频率的爬虫请求会对服务器进行攻击,对服务器造成压力,服务器响应不过来就会宕机(DDOS攻击)。
爬虫对网站的利弊
也许你会认为爬虫对于网站而言只有弊没有利,其实并不是这样,虽然爬虫大量的采集网站信息会造成别人网站好不容易做出来的信息数据被窃取,并且高频率的爬虫访问会对网站服务器进行攻击,服务器响应不过来会宕机,但是爬虫也不尽是坏处,对于小网站来说爬虫的爬取可以提高其网站的访问量(12306网站一天访问量上亿其实有80%的流量是爬虫提供的),网站的搜索排名其实就是尽可能让通用爬虫(搜索引擎爬虫)抓取来提升排名(SEO方式的一种),所以很多网站都会权衡利弊来做出相应的反爬虫措施。
应用场景
爬虫最直观的应用肯定是抓取数据,但是爬虫不仅能抓取数据还能够完成我们在浏览器上的一些操作,比如说:抢票、短信轰炸机、网上投票、抢购等,这一类操作用户都能在浏览器上操作完成,只是爬虫能够更直接更快速而且可以批量执行相关操作,理论上来说网站上可见数据或者能够执行的操作爬虫都是可以爬取和操作的,为什么说是理论上说呢?因为有些网站会设置各种反爬虫机制,能不能抓取到数据就看你能不能破解它的反爬机制。
爬虫不仅仅只能抓取网站,app数据或者电脑软件数据等也是可以抓取的,这是因为网站、app、电脑软件等后台的数据更新都是发送请求,只要找到相关请求爬虫就可以抓取
爬虫技术
爬虫技术因为太多就不一一写出来了,放一张Python爬虫技术知识点思维导图看起来更加简单明了!爬虫难点
爬虫的难点主要在于网站的反爬机制,其次高并发、海量抓取也是爬虫开发的难点之一。
反爬机制
如果所有的网站都没有反爬机制那么爬虫工程师这个岗位的含金量将会大大降低,爬虫的上手基本上没什么难度,只要学习几个请求库、提取库、数据存储就能做爬虫开发,高级的爬虫开发就是爬虫与反爬虫之间的斗争,这也是爬虫开发的乐趣所在,常用的反爬虫机制有检测请求头、访问频率异常(ip反爬)、js加密、字体反爬、css反爬、ajax异步加载、cookie、验证码等,反爬虫与反反爬虫的斗争到最后都是反反爬虫获胜,因为一个网站总不能因为反爬机制而导致正常用户访问受限,这样会损失大量的正常用户那就得不偿失了,所以网站一般只会设置相对的反爬虫机制可以抵挡一些初级爬虫,当然了对于反反爬虫而言也不是见一个反爬虫机制就去破解,首先需要考虑破解成本。headers反爬
headers反爬也就是请求头的反爬,这也是最简单最常用的反爬虫之一,我们在浏览器访问一个网站时,浏览器会向服务器发送请求,这些请求都包含了请求头和请求体等数据,服务器往往会检查你是不是正常的浏览器请求,如果不是将不会给你正确的相应,我们得到的往往是403,爬虫是不会自带headers,但是我们可以在爬虫程序中伪装请求头,这样服务器就不会检查到不正常的请求,从而我们能拿到正确的响应体。
ip反爬
ip反爬主要是服务器检测到你的ip访问太过频繁不像正常用户在浏览器访问,就会把你的ip给ban了(拉黑了)这样你就访问不了这个网站甚至这个网站附带的子网站都访问不了,而且它ban你ip可能ban一天也可能一个月或者永久,有些网站在发现ip请求过于频繁的情况不会立马ban掉ip,它为了避免误伤正常用户它会设置验证码让你来验证,判断你是否是机器爬虫,那么对于ip反爬有什么应对策略?最简单的办法就是向网站妥协收敛自己,通过给自己的爬虫限速,让爬虫的访问速度比正常人略快一点就行。最有效的办法是设置ip代理池,然后随机选择ip地址,这样就不会被ban掉ip了,就算被ban掉ip那真正的ip也是还可以访问该网站,网上有很多免费ip代理可以使用,但是可用率不高,使用人数多容易失效,所以可以购买稳定的代理ip,代理ip也有匿名程度之分,最好使用高匿代理,也可以洋葱代理,ADSL拨号代理,通过程序控制拨号每次拨号就会换一个代理。
js加密
js加密这种反爬方式可谓是五花八门了,有的是通过js技术生成一个加密参数,每次你请求都需要带这个加密参数而且不同请求加密参数还不一样,你必须携带上不然得不到数据,有的是静态页面给的是虚假数据(跟页面不一样),然后真实数据需要用js通过传递过来,它会替换虚假数据,有的是静态页面没有数据,数据全靠js执行渲染填充等等,最可怕的是有些网站把js加密的那个js文件混淆压缩了,如果对js不熟或者对js混淆压缩不熟,那么你根本就不知道如何破解js加密。js加密要破解最有效的办法就是找到加密函数分析加密算法然后反向解密就行,关键是找js文件和解密js,爬虫不能直接执行js,但是有很多执行js的库可以调用当然你也可以看懂js加密解密逻辑然后用你会的编程语言实现。js加密也可以用自动化测试来做(selenium)来做,selenium就是一个测试库,它可以驱动浏览器模拟人操作浏览器,它不需要破解js它是让浏览器执行js,但是这种做法非常慢,费时占资源,而且并不是所有的反爬都能使用selenium就能解决。
js加密比较多的是AES、DES、RSA、Base64、MD5、Hash加密等手段,这些需要我们多去了解。
验证码
网站验证码的出现很重要的一个原因就是为了限制爬虫的抓取,验证码加大了爬虫抓取的难度,现在市场上有各式各样的验证码,极验证码(滑动验证码)、图片验证码、文字验证码、九宫格验证码等,验证也不是不能破解,可以使用OCR光学识别库Tesseract(一个Google的文字识别库),但是它的识别效率不高,如果验证码有噪点或者干扰线那它很大几率无法识别,不过我们可以给它训练,对于一些高难度的验证码可以通过机器学习深度学习(卷积神经网络)多验证码进行标注训练,识别效率可以达到90%以上。还有办法就是自己手动打码或者花钱调用网上在线打码、人工代码平台接口。
时间有限其他的反爬虫机制就不多说了如果感兴趣可以直接去网上了解
高并发
高级爬虫工程师与低级爬虫工程师的主要区别在于并发、量级以及反爬,有些时候一个项目需要爬取的量达到了亿级就要考虑做高并发搭建爬虫集群了,因为简单的单线程爬虫根本就不能抓取这么大量数据,可能百万数据单线程爬虫就已经到了极限,所以需要考虑爬虫的抓取算法深度优先还是广度优先(也叫宽度优先)去抓取数据,同时还需要考虑增量爬虫,就是停止运行后下次运行能否接着上次的进度接着抓取而不是重头抓取,也要多台主机同时运作并且做到数据去重这就是爬虫分布式。爬虫如何部署,如何进行请求去重、数据去重,如何定时定点按照一定频率调度这些都是大项目需要考虑的问题。
法律问题
网络爬虫造成的最主要问题和顾虑如下:
技术方面,过于野蛮的爬虫可能造成网站负荷过大(尤其多线程爬虫),从而导致网站瘫痪、不能访问等。
内容方面,网络爬虫可能导致网站所有人丧失对自己网站数据的控制权,例如有的数据是网站所有人不愿被他人获取的;或者如果网站数据来源付出了较大代价,却可能因为网络爬虫轻易大量被他人获取。
在结果方面,网络爬虫还可能造成他人数据被不正当地复制、使用。网站数据如果涉及他人个人信息,还可能因网络爬虫导致数据大量被他人未经数据主体同意而获取,从而伤害其利益。
所以爬虫可能会涉及到一定的法律风险,俗话说的好:爬虫做的好,监狱进的早,因此我们爬虫工程师一定要规范自己,我们的爬虫应该做到:
- 审视清楚自己爬的内容,用户个人数据、机密数据、商业数据等这些都是法律红线,千万不能踩
- 抓取的数据千万不用直接使用在直接的网站上,可用于数据分析
- 限制爬虫行为,禁止近乎 DDOS 的请求频率,一旦造成服务器瘫痪,约等于网络攻击