常见的反爬手段和解决思路(爬虫与反爬虫)
常见的反爬手段和解决思路(爬虫与反爬虫)
- 学习目标
- 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波形的。 红圈部分…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
