「数据分析」2种常见的反爬虫策略,信息验证和动态反爬虫
ztj100 2025-05-22 14:58 45 浏览 0 评论
(c)作者 | leo
01 什么是爬虫?
爬虫,见名知义,就好似一个探索的小机器人,模拟人的行为,扩散到网络的各个角落,按照一定的规则搜集整理数据,并且将他们反馈回来。这是一个很形象的方式来描述爬虫的原理。
技术角度,爬虫主要是根据一定的程序规则或者技术指标,通过网络请求的方式来获取资源,然后对获取的资源通过一定的解析手段提取所要信息并存储的过程。
02 为什么会产生反爬虫?
你见过的最变态的验证码是什么呢?是要考察小学数学的验证码,还是考察人文知识的验证码,现在越来越多的奇葩验证码的出现,在一定程度上给我们这些访客带来了很多不便,但是它们的出现真正的目的并不是给用户增加使用难度,而是为了防止大多数的无节制访问的爬虫程序。
爬虫程序的访问速度和目的是很容易被发现与正常用户的区别的,大多数爬虫具有无节制,大批量对访问目标进行爬取的行为,这些访问请求会对访问目标带来巨大的服务器压力和不必要的资源投入,因此常被运营者定义为‘垃圾流量’。
因此,为了更好的维护自身的利益,营业者就会针对爬虫的特点应用不同的手段来防止大批量爬虫的访问。
根据反爬的出发点,可以将反爬限制手段分为:
o 主动型限制:开发者会通过技术手段主动的限制爬虫的访问请求,如:验证请求头信息,限制同ip的重复访问,验证码技术等等
o 被动型限制:开发者为了节省访问资源的同时也不降低用户体验,采用了间接的技术手段限制爬虫访问的方法,如:网页动态加载,数据分段加载,鼠标悬停预览数据等等。
o 而从具体的反爬虫实现手段上来进行划分,则可大致分为:信息验证型反爬虫,动态渲染型反爬虫,文本混淆型反爬虫,特征识别型反爬虫。爬虫与反爬虫无异于一场攻防博弈,既有竞争关系,也有相互促进的可能。
常见的反爬策略以及应对措施:
信息校验型爬虫:
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/)
我们通过简单的代码就可以实现对应信息的提取。
from selenium import webdriver
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来控制浏览器,还提供了很多替代手动执行的操作方法,最重要的是它还支持异步。
import asyncio
from pyppeter import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.udemy.com/course/network-security-course/')
res = await page.xpath("//*[@class='clp-lead__title']")
text = await(await res[0].getProperty('textContent')).jsonValue()
print(text)
await browser.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 图片伪装
该方法是使用图片来替换原有的文字信息,使得直接的文字提取方法失效。比如:电话
<table>
<tbody>
<tr>
<td> 电话</td>
<td><img src='phonenumber.png' class='pn'></td>
</tr>
</tbody>
</table>
该段代码为某网站截取代码,通过图片的方式将原本为文本的电话号码进行了伪装,因此如果想要获取该信息,简单的爬虫手段是不可能实现的,那么主要的应对措施是什么呢?
这里主要需要的是光学字符识别技术,对于没有像素干扰的纯文本信息可以很容易实现,在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) for i in html_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前沿模型训练营等干货学习资源。
相关推荐
- 其实TensorFlow真的很水无非就这30篇熬夜练
-
好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...
- 交叉验证和超参数调整:如何优化你的机器学习模型
-
准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...
- 机器学习交叉验证全指南:原理、类型与实战技巧
-
机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...
- 深度学习中的类别激活热图可视化
-
作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...
- 超强,必会的机器学习评估指标
-
大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...
- 机器学习入门教程-第六课:监督学习与非监督学习
-
1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...
- Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置
-
你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...
- 神经网络与传统统计方法的简单对比
-
传统的统计方法如...
- 自回归滞后模型进行多变量时间序列预测
-
下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...
- 苹果AI策略:慢哲学——科技行业的“长期主义”试金石
-
苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...
- 时间序列预测全攻略,6大模型代码实操
-
如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)