常见的反爬手段和解决思路(爬虫与反爬虫)
常见的反爬手段和解决思路(爬虫与反爬虫)
- 学习目标
- 1 服务器反爬的原因
- 2 服务器长反什么样的爬虫
- (1)十分低级的应届毕业生
- (2)十分低级的创业小公司
- (3)不小心写错了没人去停止的失控小爬虫
- (4)成型的商业对手
- (5)抽风的搜索引擎
- 3 反爬虫领域常见的一些概念
- 4 反爬的三个方向
- (1)基于身份识别进行反爬
- (2)基于爬虫行为的反爬
- (3)基于数据加密进行反爬
- 5 常见基于身份识别进行反爬
- 5.1 通过headers字段来反爬
- (1)通过headers中的user-agent
- (2)通过refer字段或者是其他字段来反馈
- (3)通过cookie来反馈
- 5.2 通过请求参数来反爬
- (1)通过html静态文件中获取请求数据(github登录数据)
- (2)通过发送请求获取请求数据
- (3)通过js生成请求参数
- (4)通过验证码来反爬
- 6 常见基于爬虫行为进行反爬
- 6.1 基于请求频率或总请求书
- (1)通过请求ip账号单位时间内总请求数量进行反爬
- (2)通过同一ip/账号请求之间的问题进行反爬
- (3)通过同一ip/账号每天请求次数设置阈值进行反爬
- 6.2 根据爬虫行为进行反爬,通常在爬取步骤上做分析
- (1) 通过js实现跳转来反爬
- (2) 通过蜜罐(陷阱)获取爬虫ip(或者代理),进行反爬
- (4) 通过假数据反爬
- (4) 堵塞任务队列
- 7 常见基于数据加密进行反爬
- (1)对响应中含有的数据进行特殊化处理
- (2)通过自定义字体来反爬 下图来自猫眼电影电脑版
- (3)通过css来反爬下图猫眼去哪儿电脑版
- (4)通过js动态生成数据进行反爬
- (5)通过数据图片化反爬
- (6)通过编码格式进行反爬
- 小结
学习目标
1.了解服务器反爬的原因
2.了解服务器长反什么样的爬虫
3.了解反爬虫领域常见的一些概念
4.了解反爬的三个方向
5.了解常见基于身份识别进行反爬
6.了解常见基于数据加密进行反爬
1 服务器反爬的原因
(1)爬虫占总PV较高,浪费资源
(2)资源被批量抓走,丧失竞争力
(3)法律的灰色地带
2 服务器长反什么样的爬虫
(1)十分低级的应届毕业生
应届毕业生的爬虫通常简单粗暴,根本不管服务器压力,加上人数不可预测,很容易把站点弄垮
(2)十分低级的创业小公司
现在的创业公司越来越多,也不知道被谁忽悠的,然后大家创了业不知道干什么好,觉得大数据比较热,就开始做大数据,分析程序全部写的差不多了,发现自己手头上没有数据。怎么办?写爬虫啊,于是就有了不计其数的小爬虫,处于公司的生死存亡,不断爬取数据。
(3)不小心写错了没人去停止的失控小爬虫
有些网站已经做了相应的反爬,但是爬虫仍然不断爬取。什么意思?就是说,他们根本爬不到任何数据,除了httpcode是200以外,一切都是不对的,可是爬虫依然不停止这个很可能就是一些托管在某些服务器上的小爬虫,已经无人认领了,依然在辛勤的工作着。
(4)成型的商业对手
这个是最大的对手,他们有技术,有钱,要什么,有什么,如果和你死磕,你就只能硬着头皮和他死磕。
(5)抽风的搜索引擎
大家不要以为搜索引擎都是好人,他们也有抽风的时候,而且一抽风就会导致服务器性能下降,请求量跟网络攻击没什么区别。
3 反爬虫领域常见的一些概念
因为反爬暂时是个比较新的领域,因此有定义要自己下:
爬虫:使用任何技术手段,批量获取网站信息的一种方式,关键在于批量
反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式,关键也是批量
误伤:在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的爬虫策略,效果再好也不能用。
拦截:成功阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策略,误伤的可能性就越高,因此需要做个权衡。
资源:机器成本和人力成本的总和。
这里要切记,人力成本也是资源,而且比机器更重要,因为根据摩尔定律,机器越来越便宜。而根据it行业的发展趋势,程序员越来越贵。因此,通常服务器反爬就是让爬虫工程师加班才是王道,机器成本并不是特别值钱。
4 反爬的三个方向
(1)基于身份识别进行反爬
看请求是否为浏览器请求,若有问题则异常
(2)基于爬虫行为的反爬
一般是来到列表页面,从列表页面获得所有详情页面url,针对页面发起请求,爬虫对此进行检查
(3)基于数据加密进行反爬
爬取时解析过程中是加密的数据,乱码等
每个方向都会有若干手段
5 常见基于身份识别进行反爬
5.1 通过headers字段来反爬
(1)通过headers中的user-agent
反爬原因:爬虫默认情况下没有user-agent,而是使用模块默认设置
解决方案:请求之前添加user-agent;更好的方式是使用user-agent池来解决(收集一堆user-agent的方式,或者随机生成user-agent)
(2)通过refer字段或者是其他字段来反馈
反爬原因:爬虫默认情况下不会带上refer字段,服务器端通过判断请求发起的源头,一次判断请求是否合法
解决方案:添加refer字段
(3)通过cookie来反馈
反爬原因:通过检查cookies来查看发起请求的用户是否具备相应权限,以此来进行反爬
解决方案:进行模拟登陆,成功获取cookies之后进行数据爬取
5.2 通过请求参数来反爬
请求参数的获取方法有很多,向服务器发送请求,很多时候需要携带请求参数,通常服务器可以通过检查请求参数是否正确来判断是否为爬虫
(1)通过html静态文件中获取请求数据(github登录数据)
反爬原因:通过增加获取请求参数的难度进行反爬
解决方案:仔细分析抓包的每个包,搞清楚请求之间的联系
(2)通过发送请求获取请求数据
反爬原因:通过增加获取请求参数的难度进行反爬
解决方案:仔细分析抓包得到的每一个包,搞清楚请求之间的联系,搞清楚请求参数的来源
(3)通过js生成请求参数
有时浏览器对账号密码等进行加密,或者通过js生成临时数据
反爬原因:js生成了请求参数
解决方案:分析js,观察加密的实现过程,通过js2py获取js的执行结果,或者使用selenium来实现
(4)通过验证码来反爬
反爬原因:对方服务器通过弹出验证码强制验证用户浏览行为
解决方案:打码平台或者机器学习的方法识别验证码,其中打码平台廉价易用,值得推荐
6 常见基于爬虫行为进行反爬
6.1 基于请求频率或总请求书
爬虫的行为与普通用户有这明显的区别,爬虫的请求评率与请求次数远高于普通用户
(1)通过请求ip账号单位时间内总请求数量进行反爬
反爬原理:正常浏览器请求网站,速度不会太快,同一个ip账号大量请求了对方服务器,有更大的可能性会被识别为爬虫
解决方法:对应的通过购买高质量的ip的方式能够解决问题/购买多个账号
(2)通过同一ip/账号请求之间的问题进行反爬
反爬原理:正常人操作浏览器浏览网站,请求之间的时间间隔是随机的,而爬虫前后两个请求之间时间间隔通常比较固定同时时间间隔较短,因此可以用来做反爬
解决方法:请求之间随机等待,模拟真实用户操作,在添加时间间隔后,为了能够告诉获取数据,尽量使用代理池,如果是账号,则将账号请求之间设置随机休眠
(3)通过同一ip/账号每天请求次数设置阈值进行反爬
反爬原理:正常的浏览行为,其一天的请求次数是有限的,通常超过某一个值,服务器就会拒绝响应
解决方法:对应的通过购买高质量的ip的方法/多账号,同时设置请求间随机休眠
6.2 根据爬虫行为进行反爬,通常在爬取步骤上做分析
(1) 通过js实现跳转来反爬
反爬原理:js实现页面跳转,无法在源码中获取下一页url
解决方法:多次抓包获取条状url,分析规律
(2) 通过蜜罐(陷阱)获取爬虫ip(或者代理),进行反爬
反爬原理:在爬虫获取链接进行请求的过程中,爬虫会根据正则,xpath,css等方式进行后续链接的提取,此时服务器端可以设置一个陷阱url,会被提取规则获取,但是正常用户无法获取,这样就能有效的区分爬虫和正常用户
解决方法:完成爬虫的编写之后,使用代理批量爬取测试/仔细分析响应内容结构,找出页面中存在的陷阱
(4) 通过假数据反爬
反爬原理:向返回的响应中添加假数据污染数据库,通常假数据不会被正常用户看到
解决方法:长期运行,核对数据库中数据同实际页面中数据对应情况,如果存在问题/仔细分析响应内容
(4) 堵塞任务队列
反爬原理:通过生成大量垃圾url,从而堵塞任务队列,降低爬虫的实际工作效率
解决方法:观察运行过程中请求响应状态/仔细分析源码获取垃圾url生成规则,对url进行过滤
7 常见基于数据加密进行反爬
(1)对响应中含有的数据进行特殊化处理
通常的特殊化处理主要指的的就是css数据偏移,自定义字体/数据加密/数据图片/特殊编码格式等
(2)通过自定义字体来反爬 下图来自猫眼电影电脑版


对于上面字体可以所有的对应起来,到时候翻译,但有些麻烦
当手机版的时候,检查发现没有进行加密了

1)反爬思路:使用自有字体文件
2)解决思路:切换到手机版/解析字体文件进行翻译
(3)通过css来反爬下图猫眼去哪儿电脑版
(4)通过js动态生成数据进行反爬
可能先拿到数据,再通过js运算得到结果,再进行渲染,在源码中并没有存在,此时若在源码中无法找到该数据,就需要查看是否js生成,后面会专门讲解js解析该如何做。
反爬原因:通过js动态生成
解决思路:解析关键js,获得数据生成流程,模拟生成数据
(5)通过数据图片化反爬
将数据转化成图片,就是使你多走好几步
58同城短租()
解决思路:通过使用图片解析引擎从图片中解析数据
(6)通过编码格式进行反爬
反爬原因:不适用默认编码格式,在获取响应之后通常爬虫使用utf-8格式进行解码,此时解码结果将会是乱码或者报错
解决思路:根据源码进行多格式解码,或者真正的解码格式
小结
掌握常见的反爬手段、原理以及应对思路
相关文章:
常见的反爬手段和解决思路(爬虫与反爬虫)
常见的反爬手段和解决思路(爬虫与反爬虫) 学习目标1 服务器反爬的原因2 服务器长反什么样的爬虫(1)十分低级的应届毕业生(2)十分低级的创业小公司(3)不小心写错了没人去停止的失控小…...
Stable Diffusion【真人模型】:人像光影摄影极限写实真实感大模型
大家好,我是极客菌 今天和大家分享一个基于SD1.5的真人大模型:人像光影摄影极限写实真实感大模型。 该模型具有以下特点: 真实肤感(在面部肌理和皮肤肌理上均有加强学习,拒绝ai出图假的问题) 永不脱妆&a…...
java实现图片添加水印
文章目录 前言一、工具类WatermarkUtil二、工具类介绍2.1 图片来源类型2.2 水印类型2.3 读取本地图片2.4 读取网络图片2.5 水印处理2.6 添加水印 三、测试添加水印总结 前言 给图片添加水印是一个很常见的需求,一般是用来防盗用。比如我们csdn上面写的文章中&#…...
CSS规则——font-face
font-face 什么是font-face? 想要让网页文字千变万化,仅靠font-family还不够,还要借助font-face(是一个 CSS 规则,它允许你在网页上使用自定义字体,而不仅仅是用户系统中预装的字体。这意味着你可以通过提…...
【单片机毕业设计选题24034】-基于STM32的手机智能充电系统
系统功能: 系统可以设置充电时长,启动充电后按设置的充电时长充电,充电时间到后自动 停止充电,中途检测到温度过高也会结束充电并开启风扇和蜂鸣器报警。 系统上电后,OLED显示“欢迎使用智能充电系统请稍后”,两秒钟…...
[C++][数据结构][图][中][图的遍历][最小生成树]详细讲解
目录 1.图的遍历1.广度优先遍历2.深度优先遍历 2.最小生成树1.Kruskal算法2.Prim算法 1.图的遍历 给定一个图G和其中任意一个顶点 v 0 v_0 v0,从 v 0 v_0 v0出发,沿着图中各边访问图中的所有顶点,且每个顶 点仅被遍历一次 “遍历”&…...
退市新规解读—财务类强制退市
一、退市风险警示:第一年触及相关指标 上市公司最近一个会计年度触及下列退市风险指标之一,公司股票或存托凭证被实施退市风险警示(*ST): 第1项 组合类财务指标 仅发行A股或B股,最近一个会计年度或追溯重述后最近一个会计年度 …...
小程序的生命周期使用方法和应用场景
小程序生命周期 初始化(App Launch) • 触发时机:小程序首次启动时。 • 主要事件:onLaunch。 • 功能与适用场景: • 全局数据初始化:设置应用的全局状态和变量。 • 登录状态检查:判断用户是…...
什么是C++模块化系统?C++20的模块化系统。
C20引入的模块化系统是一种新的代码组织和编译机制,它旨在替代传统的头文件机制,提供更好的代码组织、更快的编译速度和更强的封装性。模块化系统的主要目标包括: 减少编译时间:通过减少冗余的头文件解析和宏定义传播,…...
智慧校园-档案管理系统总体概述
智慧校园档案管理系统,作为教育信息化进程中的重要一环,它运用现代信息技术的力量,彻底改变了传统档案管理的面貌,为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…...
文心一言 VS 讯飞星火 VS chatgpt (290)-- 算法导论21.3 3题
三、给出一个包含 m 个 MAKE-SET 、UNION 和 FINDSET 操作的序列(其中有 n 个是 MAKE-SET 操作),当仅使用按秩合并时,需要 Ω(mlgn) 的时间。如果要写代码,请用go语言。 文心一言: 在并查集(Union-Find)数…...
逻辑回归梯度推导
逻辑回归是一种广泛使用的分类算法,用于估计一个事件发生的概率。它是线性回归的扩展,通过sigmoid函数将线性回归的输出映射到[0, 1]区间,从而用于分类任务。 在逻辑回归中,我们使用对数似然损失函数(log-likelihood l…...
Python 使用函数输出一个整数的逆序数
在Python中,你可以定义一个函数来输出一个整数的逆序数。这里有一个简单的实现方法: def reverse_integer(x):# 检查输入是否为整数if not isinstance(x, int):raise ValueError("Input must be an integer")# 将整数转换为字符串,…...
【Linux】Wmware Esxi磁盘扩容
目录 一、概述 1.1 磁盘分区概念 1.2 LVM概念 二、扩容步骤 二、报错 一、概述 1.1 磁盘分区概念 在 Linux 中,每一个硬件设备都映射到一个系统的文件,对于硬盘、光驱等 IDE 或 SCSI 设备也不例外。Linux把各种 IDE 设备分配了一个由 hd 前缀组成的文…...
树莓派4B_OpenCv学习笔记15:OpenCv定位物体实时坐标
今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 今日学习 OpenCv定位物体实时位置,代码来源是…...
MySQL之如何定位慢查询
1、如何定位慢查询 1.1、使用开源工具 调试工具:Arthas 运维工具:Promethuss、Skywalking 1.2、MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒&#x…...
Open3D 删除点云中重复的点
目录 一、算法原理1、重叠点2、主要函数二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、重叠点 原始点云克隆一份 构造重叠区域 合并点云获得重叠点 2、主要…...
填报志愿选专业是兴趣重要还是前景重要?
进行专业评估,找到一个适合自己的专业是一件非常困难的事情。在进行专业选择时,身上理想化色彩非常严重的人,会全然不顾及他人的劝阻,义无反顾的以兴趣为主,选择自己热爱的专业。一些较多考虑他人建议,能听…...
python开发基础——day9 函数基础与函数参数
一、初识函数(function) 编程函数!数学函数,里面的是逻辑,功能,而不是套公式 编程函数的作用实现特定操作的一段代码 你现在请客,每个人都点同样的一份吃的,请100个人 1.薯条 2.上校鸡块 3.可乐 那…...
STM32——使用TIM输出比较产生PWM波形控制舵机转角
一、输出比较简介: 只有高级定时器和通用寄存器才有输入捕获/输出比较电路,他们有四个CCR(捕获/比较寄存器),共用一个CNT(计数器),而输出比较功能是用来输出PWM波形的。 红圈部分…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
