「数据分析」2种常见的反爬虫策略,信息验证和动态反爬虫

©作者 | leo

01 什么是爬虫?

爬虫,见名知义,就好似一个探索的小机器人,模拟人的行为,扩散到网络的各个角落,按照一定的规则搜集整理数据,并且将他们反馈回来。这是一个很形象的方式来描述爬虫的原理。

技术角度,爬虫主要是根据一定的程序规则或者技术指标,通过网络请求的方式来获取资源,然后对获取的资源通过一定的解析手段提取所要信息并存储的过程。

02 为什么会产生反爬虫?

你见过的最变态的验证码是什么呢?是要考察小学数学的验证码,还是考察人文知识的验证码,现在越来越多的奇葩验证码的出现,在一定程度上给我们这些访客带来了很多不便,但是它们的出现真正的目的并不是给用户增加使用难度,而是为了防止大多数的无节制访问的爬虫程序。

爬虫程序的访问速度和目的是很容易被发现与正常用户的区别的,大多数爬虫具有无节制,大批量对访问目标进行爬取的行为,这些访问请求会对访问目标带来巨大的服务器压力和不必要的资源投入,因此常被运营者定义为‘垃圾流量’。

因此,为了更好的维护自身的利益,营业者就会针对爬虫的特点应用不同的手段来防止大批量爬虫的访问。

根据反爬的出发点,可以将反爬限制手段分为:

• 主动型限制:开发者会通过技术手段主动的限制爬虫的访问请求,如:验证请求头信息,限制同ip的重复访问,验证码技术等等

• 被动型限制:开发者为了节省访问资源的同时也不降低用户体验,采用了间接的技术手段限制爬虫访问的方法,如:网页动态加载,数据分段加载,鼠标悬停预览数据等等。

• 而从具体的反爬虫实现手段上来进行划分,则可大致分为:信息验证型反爬虫,动态渲染型反爬虫,文本混淆型反爬虫,特征识别型反爬虫。爬虫与反爬虫无异于一场攻防博弈,既有竞争关系,也有相互促进的可能。

常见的反爬策略以及应对措施:

信息校验型爬虫:

a. User-Agent发爬虫:

基本原理:能够向服务器端发送请求的客户端形式多种多样,既可以是不同型号的个人电脑,手机,平板电脑,编程程序,也可以是网络请求软件,那么服务器该如何识别这些不同的客户端呢?

User-Agent便是这样一个用户发送请求时附带的请求信息的记录。它的主要格式包括如下几个部分:

💡 **浏览器标识(操作系统标识,加密等级标识;浏览器语言)渲染引擎标识 版本信息**

例如:

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)

而User-Agent的反爬主要就是通过对User-Agent的头域值进行校验,如果存在黑名单中的值,就会被服务器端封杀。

例如我们Python中常用的Requests库,如果在发送请求时不做Headers参数设置,则服务器读取User-Agent的值就是python-requests/2.21.0

b. Cookies反爬虫

Cookies不仅能够用于存储Web用户的身份信息或者保持登录状态,此外也会被用作反爬虫的识别信息。

主要的原理是客户端访问服务器时,服务器会返回Set-Cookie头域,客户端会将该信息进行存储,再次进行访问服务器时会携带对应的Cookie信息,这时服务器端只要验证该Cookie是否符合规则就可以了,如果不符合,则会被重定向到其他页面,并在响应中添加Set-Cookie头域和Cookie值。

以上验证Cookie的方法仅仅是比较简单的反爬机制,爬虫工程师仅仅需要在浏览器的请求头中复制该Cookie即可轻松规避,这时Cookie验证常常要结合javascript文件,生成随机Cookie值进行校验:

💡 **Cookie名称+3位小于9的随机正整数+5位随机大写字母+6位小于9的正整数+3位随机大写字母**

该机制还是有可以反复使用的可能性,即使加上Cookie过期时间也不能完全保证Cookie的复用,这时需要引入时间戳结合上述方法进行进一步判定,当Cookie值取出时的时间戳和当前时间戳进行差值计算,超过一定时间,就会被认定为伪造。

c. 签名验证反爬虫:

主要原理时通过客户端生成的一些随机数和不可逆的MD5加密字符串,在发送请求时发送给服务器,服务器端使用相同方式进行随机值运算并做MD5加密,如果服务器端得到的MD5值和前端的MD5值相等,则表示请求正常,否则返回403.

目前该反爬虫方式广泛应用于各类大型网站,绕过它不仅需要从XHR信息中找到相关的请求信息,此外还要在Javacript代码中寻找加密的方式。

动态渲染反爬虫:

动态网页往往是为了提升用户体验,节约资源消耗,提升响应速度而应用的技术,并非直接针对爬虫程序来进行的反爬措施,但是在不经意间产生了反爬虫的效果,爬虫程序不具备页面渲染功能,而一旦遇到动态渲染页面,则不能完整的返回需要的信息。

比如我们要爬取英雄联盟里面的英雄名称和下载对应图片时,按照原有的爬取方式,使用requests库来进行爬取,会发现获取的字段均为空值,这主要的原因是该网站使用了javacript动态加载技术,只有找到核心的js传输代码,才能找到对应信息。

通过网页检查工具我们可以清晰的看到,hero_list.js这个文件存储了所有的英雄信息,以及对应的英雄图片链接和详情页信息。

那么我们在进行信息解析时,就需要针对该js文件进行。

动态渲染的主要解决思路:

动态渲染技术组合非常灵活,如果每次遇到这样的网站,我们都要去分析接口,参数和javascript代码逻辑,那么耗费的时间成本就会高很多。那么能够直接的提取渲染后的结果页面对于爬虫分析就会简单很多,目前主要的渲染提取工具包括:Puppeter,Selenium,Splash。

2.1 Selenium

Selenium是我们最为常用的一种解决动态渲染的技术。

浏览器驱动是Selenium对浏览器发送指令或者传递渲染结果的主要工具。

目前该驱动一般是通过下面网址下载的:

💡

[http://npm.taobao.org/mirrors/chromedriver/](http://npm.taobao.org/mirrors/chromedriver/)

我们通过简单的代码就可以实现对应信息的提取。

fromseleniumimportwebdriver

url ='https://www.udemy.com/course/network-security-course/'

driver = webdriver.Chrome()

res = driver.get(url)

course = driver.find_element_by_css_selector('.clp-lead__title').text.replace('\n','')

print(course)

driver.quit()

2.2 Puppeter

在使用Selenium进行数据爬取时,如果遇到大批量任务执行时,显然要花费较长时间,这时我们会引入异步加载提取数据的方法,那就是Puppeter方法,它是google开源的Node库,除了拥有一套高级的API来控制浏览器,还提供了很多替代手动执行的操作方法,最重要的是它还支持异步。

importasyncio

frompyppeterimportlaunch

asyncdefmain():

browser =awaitlaunch()

page =awaitbrowser.newPage()

awaitpage.goto('https://www.udemy.com/course/network-security-course/')

res =awaitpage.xpath("//*[@class='clp-lead__title']")

text =await(awaitres[0].getProperty('textContent')).jsonValue()

print(text)

awaitbrowser.close()

asyncio.get_event_loop().run_until_complete(main())

2.3 分布式渲染服务Splash

Splash应用于分布式爬取需求,假设我们要在更多个机器中运行爬虫程序,还能否通过安装Puppeter和Selenium组件来完成呢?显然是否定的。

Splash是一个异步的Js渲染服务,自带轻量级web浏览器,当我们将它部署在云端时,就可以通过同个API使多个爬虫程序访问渲染的页面了。

动态网页的广泛应用除了为了提高用户体验,也在一定程度限制了爬虫程序的使用,而结合动态渲染技术进行页面解析解决了80%以上的复杂页面的爬取,但是效率却远不及直接解析javascript文件快速,而寻找网站入口、js文件的定位往往也会耗费大量的时间,因此具体的技术使用需要根据实际情况灵活使用。

03 文本混淆反爬虫

文本混淆可以有效的避免爬虫获取Web应用中的文字数据,通过混淆文本信息来限制爬虫获取数据的技术手段称为文本混淆反爬虫。

文本混淆反爬虫的前提是不影响正常用户的使用体验,因此文本混淆不能直接的展现出来,所以开发者通常是利用CSS特性来实现混淆。

常见的文本混淆方法包括:图片伪装、文字映射和自定义字体

3.1 图片伪装

该方法是使用图片来替换原有的文字信息,使得直接的文字提取方法失效。比如:电话

电话

该段代码为某网站截取代码,通过图片的方式将原本为文本的电话号码进行了伪装,因此如果想要获取该信息,简单的爬虫手段是不可能实现的,那么主要的应对措施是什么呢?

这里主要需要的是光学字符识别技术,对于没有像素干扰的纯文本信息可以很容易实现,在python中我们主要使用PyTesseract库来实现图片文字的提取。

3.2 SVG映射反爬虫

SVG是一种基于XML描述图形的二维矢量图形格式,对该图形放大缩小都不会影响图形质量。这个特点被广泛应用于Web网站中。

使用SVG映射反爬虫主要原理是通过不同字符串与不同数字进行映射,服务器在进行数据解析时,做相关处理,再由浏览器进行渲染,最终实现隐藏信息的目的。

而绕过SVG映射可以通过提取相关信息进行数据对应的方法来解决,如下图,我们通过找到html代码中类对映数字的映射关系,最终得到了电话号码信息。

mappings = {

'vhk08k':0,'vhk6zl':1,'vhk9or':2,'vhkfln':3,'vhkbvu':4,'vhk84t':5,'vhkvxd':6,

'vhkqsc':7,'vhkkj4':8,'vhk0f1':9,

}

html_class = ['vhkbvu','vhk08k','vhkfln','vhk0f1']

phone_num = [mappings.get(i)foriinhtml_class]

print(phone_num)

目前主流反爬虫技术展现:

除了以上的爬虫技术,目前还包括了常见的验证码识别反爬虫,它的主要实现机理就是通过各种动态生成的验证码,来阻止爬虫访问网页信息,那么绕过验证码也是目前的一个技术难点,传统的字符图形验证码可以通过光学识别来解决,而对于动态滑块验证码、逻辑运算验证码则要结合多种技术才能够实现。

另外一种比较常见的反爬虫是特征识别反爬虫,如果你尝试过爬取Boss直聘网页信息,就会发现无论你使用常规的爬取方法或者使用Selenium动态渲染工具,亦或者分析Javascript文件,基本不能够有效的提取相关数据,返回值都是空值,这主要的原因就是目标站采用WebDriver特征识别,主要原理就是反爬虫程序能够识别发送请求的客户端的webdriver属性是否是通过webdriver驱动浏览器来进行访问的,那么绕过方法也是围绕这个属性展开,对于webdriver检测主要的结果有三种:true,false,undefined,当我们使用渲染工具具有webdriver属性时,返回值就是true,那么我在触发验证该属性前将它修改为false或者underfined就可以规避这种识别。

以上就是对目前主流常见的反爬技术和绕过策略的简单阐述,在这场攻守博弈中,核心思想都是如何去分析对方的实现机理,才能更好的想到解决方案,当然里面也涉及很多深入的理论知识,同时也有大量的人为逻辑陷阱在其中,因此掌握爬虫技术,实践和理论学习都是同等重要的。

目前主流反爬虫技术展现:

除了以上的爬虫技术,目前还包括了常见的验证码识别反爬虫,它的主要实现机理就是通过各种动态生成的验证码,来阻止爬虫访问网页信息,那么绕过验证码也是目前的一个技术难点,传统的字符图形验证码可以通过光学识别来解决,而对于动态滑块验证码、逻辑运算验证码则要结合多种技术才能够实现。

另外一种比较常见的反爬虫是特征识别反爬虫,如果你尝试过爬取Boss直聘网页信息,就会发现无论你使用常规的爬取方法或者使用Selenium动态渲染工具,亦或者分析Javascript文件,基本不能够有效的提取相关数据,返回值都是空值。

这主要的原因就是目标站采用WebDriver特征识别,主要原理就是反爬虫程序能够识别发送请求的客户端的webdriver属性是否是通过webdriver驱动浏览器来进行访问的。

那么绕过方法也是围绕这个属性展开,对于webdriver检测主要的结果有三种:true,false,undefined,当我们使用渲染工具具有webdriver属性时,返回值就是true,那么我在触发验证该属性前将它修改为false或者underfined就可以规避这种识别。

以上就是对目前主流常见的反爬技术和绕过策略的简单阐述,在这场攻守博弈中,核心思想都是如何去分析对方的实现机理,才能更好的想到解决方案,当然里面也涉及很多深入的理论知识,同时也有大量的人为逻辑陷阱在其中,因此掌握爬虫技术,实践和理论学习都是同等重要的。

私信我领取目标检测与R-CNN/数据分析的应用/电商数据分析/数据分析在医疗领域的应用/NLP学员项目展示/中文NLP的介绍与实际应用/NLP系列直播课/NLP前沿模型训练营等干货学习资源。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容