「数据分析」2种常见的反爬虫策略,信息验证和动态反爬虫
off999 2025-09-03 07:02 15 浏览 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前沿模型训练营等干货学习资源。
相关推荐
- u盘在电脑上怎么找出来(u盘在电脑上怎么找到)
-
在电脑中找不到u盘,是因为系统没有自动识别出来,手动打开即可,具体的解决步骤如下:1、在桌面上点击我的电脑,右键,管理。2、打开管理界面,点击储存。3、进到储存页面。4、到这一步,也就可以看到了,有这...
- 联想一体机怎么进入bios(联想一体机怎么进入u盘启动)
-
所需工具:联想Lenovo品牌一体机、启动U盘。具体步骤如下:1、联想一体机从U盘启动设置步骤如下重启联想一体机,启动过程中按F1进入BIOS,部分机型则是开机按Enter键,进入之后再按F12选择进...
- 如何装ghost系统盘(ghost装机教程)
-
ghost是不能做系统c盘,它是一种对硬盘和分区制作成映像文件进行备份和恢复的工具软件,是不能进行操作系统安装。这个软件的使用目的是,当我们安装配置好操作系统以后,用ghost软件对c盘进行备份,或者...
- 加密u盘如何格式化(加密u盘如何格式化手机)
-
1,点击系统与安全进入电脑的控制面板界面,点击上方的系统与安全的选项,在系统界面找到最下方的管理工具功能组。2,选中u盘选择管理工具下面的创建并格式化硬盘分区,点击弹出磁盘管理的界面,在这个里面选中你...
- 万能显卡驱动离线版pc(万能显卡驱动离线版)
-
万用驱动是综合各电脑硬件的性能而制做的软件,对于大多数的电脑硬件驱动都好用,但对于少数品牌电脑驱动要求严格的,就不灵了。有的硬件用万能驱动后,使用效果不佳,就是因为没有完全驱动好。所以,知名品牌电脑硬...
- 笔记本windows8系统下载(笔记本电脑系统win8)
-
在电脑上面就可以下载,打开浏览器搜索windous8系统会出现一些下拉选择,选择第一条或者选择有官网字样的,就直接有下载按钮,然后点击下载就可以了win8可以支持现在可以见到的所有Photosho...
- win 11(win 11 25h2)
-
Windows11是由微软公司(Microsoft)开发的操作系统,应用于计算机和平板电脑等设备。于2021年6月24日发布,2021年10月5日发行。Windows11提供了许多创新...
- 手机视频恢复软件免费版下载
-
手机视频删了怎么恢复 一、安卓手机视频恢复 1.打开电脑,移动鼠标,进入互盾安卓恢复大师官网,下载并安装该软件。手机连接至电脑。手机视频删了怎么恢复 2.打开运行互盾安卓恢复大师,在软件界面看到...
- diy电脑装机教程(diy电脑组装步骤)
-
1,看价格。根据自己的预算价格,选择适合该价格的电脑。注意不要以过高的价格买到配置过低的电脑;2,看性能。根据自己需要的电脑性能,以合理的价格购买。注意不要以过高的价格买到配置过低的电脑。电脑的配置如...
- u盘莫名其妙要格式化(u盘总是要格式化什么意思)
-
如果您在使用U盘时突然收到提示需要格式化的消息,这可能是由于以下原因之一引起的:U盘感染病毒:U盘中可能存在恶意病毒,这些病毒可能会导致U盘无法正常使用。当您尝试打开U盘时,系统会提示您进行格式化操作...
- win7家庭版原版(win7家庭版价格)
-
你的win7旗舰版应该是个盗版软件,在你使用的过程中你可能触碰到了后台升级,升级完以后就变成了家庭版了,在你不知不觉中被改变的,厄这个软件属于盗版的,厄升级完以后没什么大区别,这个旗舰版家庭版在家里面...
- win10自动更新失败怎么办(win10自动升级失败)
-
安装更新失败有许多原因。WindowsUpdate需要能够扫描您的计算机以了解需要哪些更新,并能够下载和安装这些更新。如果某个阶段遇到问题,则可能阻止某个更新安装到计算机中。有关错误或失败的详细信...
- 截图的几种方法(截图的几种方法有哪些)
-
第一种截图方式:按printScreen键。按一下键盘上的printScreen键以后,整个屏幕会被截取下来,截图会默认保存在剪贴板中。第二种截图方式:使用微信截图。进入聊天界面,我们会发...
- 电脑装了两个系统怎么切换(电脑安装2个系统怎么更换启动)
-
1.点击运行打开电脑点击左下角的开始菜单栏选项,右击鼠标在序列栏中选择运行打开。2.输入msconfig接着在运行的输入框中输入msconfig点击确定即可打开系统配置。3.点击引导打开系统配置的页面...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
