网络爬虫和反爬虫技术研究
Posted 韩思工作室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络爬虫和反爬虫技术研究相关的知识,希望对你有一定的参考价值。
在现今这个大数据时代,数据正在驱动着企业的业务和运营,有了数据的支撑就可以对用户进行用户画像和个性化定制,数据更可以指明方案设计和决策优化方向,所以互联网产品的开发都是离不开对数据的收集和分析,数据收集的一种正规的方式是通过上报API进行自身平台用户交互情况的捕获,还有另外一种不正规的常见手段是使用开发爬虫程序来爬取竞品平台的数据。
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫等。
互联网的迅速发展使之成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎如通用搜索引擎Google和百度等,作为一个辅助人们检索信息的工具成为用户访问互联网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如:
不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。
通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。
互联网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。
通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。
为了解决上述的这些实际存在的问题,定向抓取相关网页资源的网络爬虫应运而生,网络爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问互联网上的网页与相关的链接,获取所需要的信息。网络爬虫往往并不追求大的覆盖,而是将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源,这种网络爬虫又称为聚焦爬虫。
网络爬虫是一个自动提取网页的程序,它为搜索引擎从互联网上下载网页,是搜索引擎的重要组成,传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件,而聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列,然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索,对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:
对抓取目标的描述或定义;
对网页或数据的分析与过滤;
对URL的搜索策略。
网络爬虫的应用场景
(一)互联网平台,偏向销售公司对客户信息的爬取
◾客户信息的爬取可以释放销售人员寻找客户资源的时间,提高销售对市场开发的效率;
◾爬取相关平台上的客户信息,上报到CRM管理系统,提供给销售人员进行开发;
(二)资讯爬取并应用到平台业务中
◾经常浏览资讯的时候会发现其实很多平台的热门资讯内容都很相似,尊重版权的平台,会标明来源出处;
◾爬取资讯信息,应用到资讯业务中,可以减轻资讯内容编辑人员的压力,如果不需要创造自己的内容,也可全部托管给程序AI运营;
(三)竞品公司重要数据挖掘分析与应用
◾竞品平台重要业务数据,如:汽车X家的车型信息,X哪儿的酒店信息,返X网的商品信息等;
◾爬取竞品重要数据,对数据进行筛选和处理,然后投入业务中展示,增加这块业务数据量,减轻这块资源的运营编辑的压力。
推荐使用python开发网络爬虫,特点是入门比较简单,代码短小精干,各种便于爬虫开发的模块和框架。当然了,很多语言也都可以开发爬虫,但是均都不是很全面,根据实际技术栈和开发场景去使用,语言只是工具,思路才是通用的。
开发爬虫开发,需要对WEB这块有相对全面深入的理解,这样后面遇到反爬虫才能得心应手,见招拆招:
了解html,会使用HTML标签构造页面,知道如何解析出DOM里标签,提取想要的数据内容
了解CSS,了解CSS,会解析出样式里的数据内容
了解JS,基本JS语法,能写能读懂,并了解JS库:Jquery,Vue 等,可以对使用开发者工具调试JS
了解JSON,了解JSON数据,会序列化和反序列化数据,通过解析JSON对象获取数据内容
了解HTTP/HTTPS,能够分析请求信息和响应信息,可以通过代码构造请求
会正则解析,通过正则匹配出符合规则的字符串,提取想要的数据内容
会数据库操作,通过数据库操作对爬取数据进行存储,如:mysql语法
会使用开发者工具,浏览器F12开启开发者工具,需要会使用开发者工具调试HTML,CSS,JS等;
会模拟请求,工具:Charles,Fiddler,Postman,通过模拟请求,分析出请求需要那些必要的信息,如:参数,COOKIE,请求头,懂得怎么模拟请求就知道编码的时候如何去构造;
能定位数据,数据在API中:前端/原生APP请求数据API,API返回数据大部分是JSON格式,然后渲染展示,数据在HTML中:查看页面HTML源代码,如果源代码里有想要获取的数据,就说明在服务端已经绑定好数据在HTML里,数据在JS代码中:查看页面HTML源代码,如果获取数据不在HTML里,又没有请求数据API,可以看下数据是不是绑定到JS变量里;
会部署,可以部署到Windows或者Linux服务器,使用工具进行爬虫进程监控,然后进行定时轮训爬取;
以下是一些开源的网络爬虫,值得研究一下其技术架构和实现方式:
§ DataparkSearch是一个在GNU GPL许可下发布的爬虫搜索引擎;
§ GNU Wget是一个在GPL许可下,使用C语言编写的命令行式的爬虫。它主要用于网络服务器和FTP服务器的镜像;
§ Heritrix是一个互联网档案馆级的爬虫,设计的目标为对大型网络的大部分内容的定期存档快照,是使用java编写的;
§ Ht://Dig在它和索引引擎中包括了一个网页爬虫;
§ HTTrack用网络爬虫创建网络站点镜像,以便离线观看。它使用C语言编写,在GPL许可下发行。
§ ICDLCrawler是一个用C++编写,跨平台的网络爬虫。它仅仅使用空闲的CPU资源,在ICDL标准上抓取整个站点。
§ JSpider是一个在GPL许可下发行的,高度可配置的,可定制的网络爬虫引擎。
§ LLarbin由SebastienAilleret开发;
§ Webtools4larbin由AndreasBeder开发;
§ Methabot是一个使用C语言编写的高速优化的,使用命令行方式运行的,在2-clauseBSD许可下发布的网页检索器。它的主要的特性是高可配置性,模块化;它检索的目标可以是本地文件系统,HTTP或者FTP;
§ Nutch是一个使用java编写,在Apache许可下发行的爬虫。它可以用来连接Lucene的全文检索套件;
§ Pavuk是一个在GPL许可下发行的,使用命令行的WEB站点镜像工具,可以选择使用X11的图形界面。与wget和httprack相比,他有一系列先进的特性,如以正则表达式为基础的文件过滤规则和文件创建规则;
§ WebVac是斯坦福WebBase项目使用的一个爬虫;
§ WebSPHINX是一个由java类库构成的,基于文本的搜索引擎。它使用多线程进行网页检索,html解析,拥有一个图形用户界面用来设置开始的种子URL和抽取下载的数据;
§ WIRE-网络信息检索环境是一个使用C++编写,在GPL许可下发行的爬虫,内置了几种页面下载安排的策略,还有一个生成报告和统计资料的模块,所以,它主要用于网络特征的描述;
§ LWP:RobotUA是一个在Perl5许可下发行的,可以优异的完成并行任务的 Perl类库构成的机器人;
§ Web Crawler是一个为.net准备的开放源代码的网络检索器(C#编写);
§ SherlockHolmes收集和检索本地和网络上的文本类数据(文本文件,网页),该项目由捷克门户网站中枢(Czech webportal Centrum)赞助并且主用商用于这里;它同时也使用在;
§ YaCy是一个基于P2P网络的免费的分布式搜索引擎(在GPL许可下发行);
§ Ruya是一个在广度优先方面表现优秀,基于等级抓取的开放源代码的网络爬虫。在英语和日语页面的抓取表现良好,它在GPL许可下发行,并且完全使用Python编写。按照robots.txt有一个延时的单网域延时爬虫;
§ UniversalInformation Crawler快速发展的网络爬虫,用于检索存储和分析数据;
§ AgentKernel,当一个爬虫抓取时,用来进行安排,并发和存储的java框架;
§ Dine是一个多线程的java的http客户端。它可以在LGPL许可下进行二次开发。
在网络爬虫的系统框架中,主过程由控制器,解析器,资源库三部分组成。控制器的主要工作是负责给多线程中的各个爬虫线程分配工作任务。解析器的主要工作是下载网页,进行页面的处理,主要是将一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容处理掉,爬虫的基本工作是由解析器完成。资源库是用来存放下载到的网页资源,一般都采用大型的数据库存储,如Oracle数据库,并对其建立索引。
控制器,控制器是网络爬虫的中央控制器,它主要是负责根据系统传过来的URL链接,分配一线程,然后启动线程调用爬虫爬取网页的过程。
解析器,解析器是负责网络爬虫的主要部分,其负责的工作主要有:下载网页的功能,对网页的文本进行处理,如过滤功能,抽取特殊HTML标签的功能,分析数据功能。
资源库,主要是用来存储网页中下载下来的数据记录的容器,并提供生成索引的目标源。中大型的数据库产品有:Oracle、Sql Server等。
截止到 2007 年底,Internet 上网页数量超出 160 亿个,研究表明接近 30%的页面是重复的;动态页面的存在:客户端、服务器端脚本语言的应用使得指向相同 Web 信息的 URL 数量呈指数级增长。上述特征使得网络爬虫面临一定的困难,主要体现在 Web 信息的巨大容量使得爬虫在给定时间内只能下载少量网页。 Lawrence 和 Giles 的研究表明没有哪个搜索引擎能够索引超出 16%的Internet 上 Web 页面,即使能够提取全部页面,也没有足够的空间来存储。为提高爬行效率,爬虫需要在单位时间内尽可能多的获取高质量页面,是它面临的难题之一。当前有五种表示页面质量高低的方式:Similarity(页面与爬行主题之间的相似度)、Backlink(页面在 Web 图中的入度大小)、PageRank(指向它的所有页面平均权值之和)、Forwardlink(页面在 Web 图中的出度大小)、Location(页面的信息位置);Parallel(并行性问题)。
为了提高爬行速度,网络通常会采取并行爬行的工作方式,随之引入了新的问题:重复性(并行运行的爬虫或爬行线程同时运行时增加了重复页面)、质量问题(并行运行时,每个爬虫或爬行线程只能获取部分页面,导致页面质量下降)、通信带宽代价(并行运行时,各个爬虫或爬行线程之间不可避免要进行一些通信)。并行运行时,网络爬虫通常采用三种方式:独立方式(各个爬虫独立爬行页面,互不通信)、动态分配方式(由一个中央协调器动态协调分配 URL 给各个爬虫)、静态分配方式(URL 事先划分给各个爬虫)。
下述的三种网络特征,造成了设计网页爬虫抓取策略变得很难:
巨大的数据量,巨大的数据量暗示了爬虫,在给定的时间内,只可以抓取所下载网络的一部分,所以,它需要对它的抓取页面设置优先级;
快速的更新频率,快速的更新频率说明在爬虫抓取下载某网站一个网页的时候,很有可能在这个站点又有新的网页被添加进来,或者这个页面被更新或者删除了;
动态页面的产生,当今新增的很多页面都是通过服务器端脚本语言产生的,无穷的参数组合也增加了爬虫抓取的难度,只有一小部分这种组合会返回一些独特的内容。例如,一个很小照片存储库仅仅通过get方式可能提供就给用户三种操作方式。如果这里存着四种分类方式,三种缩略图方式,两种文件格式,和一个禁止用户提供内容的选项,那么,同样的内容就可以通过48种方式访问。
这种数学组合给网络爬虫创造的难处就是,为了获取不同的内容,必须筛选无穷仅有微小变化的组合:
1)选择策略,决定所要下载的页面;
2)重新访问策略,决定什么时候检查页面的更新变化;
3)平衡礼貌策略,指出怎样避免站点超载;
4)并行策略,指出怎么协同达到分布式抓取的效果;
网络爬虫对于网站平台造成了数据安全和流量压力,因此从网站平台的角度而言,反爬虫就是不可避免的了。反爬虫可以分为服务端限制和前端限制
服务端限制:服务器端行请求限制,防止爬虫进行数据请求
前端限制:前端通过CSS和HTML标签进行干扰混淆关键数据,防止爬虫轻易获取数据
具体的实现方式如下:
(一)设置请求头(服务端限制)
Referer
User-Agent
…
(二)签名规则(服务端限制)
如果是JS发起的请求,签名规则可以在JS函数中找到,然后再根据规则去构造签名
如果是APP发起的请求,可能是前端调用原生封装的方法,或者原生发起的,这个就比较无解,需要反编译APP包,也不一定能成功
延迟,或者随机延迟(服务端限制),如果请求被限制,建议可以试试请求延迟,具体延迟xxx毫秒/x秒,根据实际情况设定合适的时间
(三)代理IP(服务端限制)
如果延迟请求还是被限制,或者需要延迟很长时间才不会被限制,那就可以考虑使用代理IP,根据实际场景与限制的规律去运用,一般只要被限制的时候就切换请求的代理IP,这样就基本可以绕过限制
目前有很多收费的代理IP服务平台,有各种服务方式,具体可以搜索了解下,费用一般都在可以接受的范围
(四)登录限制(服务端限制)
请求带上登录用户的COOKIE信息
如果登录用户COOKIE信息会在固定周期内失效,那就要找到登录接口,模拟登录,存储COOKIE,然后再发起数据请求,COOKIE失效后重新这个步骤
(五)验证码限制(服务端限制)
简单验证码,对图片里的字母或者数字进行识别读取,使用识图的模块包可以实现
复杂验证码,无法通过识图识别,可以考虑使用第三方收费服务
(六)CSS/HTML混淆干扰限制(前端限制)
前端通过CSS或者HTML标签进行干扰混淆关键数据,破解需要抽样分析,找到规则,然后替换成正确的数据
1、font-face,自定义字体干扰
如列子:汽车X家论帖子,猫X电影电影评分
2 、伪元素隐藏式
通过伪元素来显示重要数据内容
如例子:汽车X家
破解思路:找到样式文件,然后根据HTML标签里class名称,匹配出CSS里对应class中content的内容进行替换
3、backgroud-image
通过背景图片的position位置偏移量,显示数字/符号,如:价格,评分等
破解思路:根据backgroud-postion值和图片数字进行映射
4、 html标签干扰
通过在重要数据的标签里加入一些有的没的隐藏内容的标签,干扰数据的获取
如例子:xxIP代理平台
破解思路:过滤掉干扰混淆的HTML标签,或者只读取有效数据的HTML标签的内容
有些平台发现爬虫后并不会进行限制封杀,而是给爬虫提供误导的数据,影响他们进行错误的决策,这就是投毒,为了防止被投毒,需要对数据进行抽样校验。
目前大部分中小平台对防御爬虫的意识还比较薄弱,促使了爬虫的盛行,通过爬虫可以用比较小的代价,获取更大的利益,竞品数据的挖掘分析与应用对于业务增长有着举足轻重的作用,爬虫开发对于互联网产品公司的来说是个必不可少的技术。
当前并没有一种可以完全避免爬虫的技术,所以添加反爬虫策略只是增加了一定的难度门槛,只要拆招技术够硬还是可以被突破翻越,反爬虫和反反爬虫是技术之间的较量,这是一场永不停息的没有硝烟的战争。
在本文结束前,简单谈一下RPA软件机器人和网络爬虫的异同之处,按照两者的本质而言,RPA软件机器人和网络爬虫都可以从网页上获取信息。网络爬虫在处理网页内容时直接操作HTML,利用正则表达式非常灵活和精细(“非正规”,未经许可擅自闯入偷东西——“拍照”、“下载”等等),而RPA操作的是可见的网络元素,模拟人的操作可以,但比较“正规”(具有权限,获得许可,本来是由人来完成的操作,现在用用软件机器人代替人来完成),替代网络爬虫比较困难,同时,RPA软件机器人是被授权替代人工来完成操作的,因此在网页上可以做的事情就要多得多了,不限于获得信息,“拍照”、“下载”之外,可以根据权限做一些操作,例如“更新”、“删除”等。
当然了,从反爬虫的角度来说,反爬虫的技术手段有可能会“误伤”RPA软件机器人,使其无法工作,例如使用验证码,不能识别验证码就操作不下去,这就要利用OCR技术来识别验证码了,验证码多种多样,已经玩出了花样,怎么搞定?这就需要利用人工智能的技术了,最近的一篇报道使人工智能AI已经可以搞定复杂的验证码了。从操作的复杂性来说,反爬虫想要识别是人在操作还是RPA软件机器人在操作是很难的,而最难抓的爬虫是人肉爬虫,但是,人肉爬虫,这——还算是爬虫吗?
简而言之,RPA软件机器人做的是替代人来完成“大量重复”和“规则明确”的操作的(“代工”),而网络爬虫是用来从互联网各种平台上扒取信息的(“小偷”),反爬虫是保护网络平台信息安全不被扒取的(“保安”),“保安”防“小偷”,有时会误伤到“代工”,而“小偷”也在千方百计的想要找到办法,绕过“保安”,扒取到需要的数据和信息,这就是三者的关系。《天下无贼》里葛优扮演的老贼头黎叔说“21世纪,什么最贵?人才!”因此,最适合写网络爬虫的Python程序猿才会那么贵了!
以上是关于网络爬虫和反爬虫技术研究的主要内容,如果未能解决你的问题,请参考以下文章