7. user-Agent破解反爬机制

news2024/11/27 1:24:46

1. 为什么要设置反爬机制

普通用户通过浏览器访问网站。

爬虫是靠程序代码来访问网站。

爬虫程序可能会篡改资源信息。

爬虫程序会引发短时间内的访问激增。

导致服务器压力过大。

为了提高安全性,因此绝大多数网站都实施了反爬措施,对爬虫程序进行拦截。

【总结】

设置反爬机制是为了保护网站的数据和资源不被恶意爬虫或者机器人滥用和攻击。

恶意爬虫或机器人可能会对网站造成严重的影响,如消耗网站的带宽和服务器资源、盗取网站的数据、影响网站的正常运行等。

因此,为了保护网站的安全和稳定性,设置反爬机制是必要的。

同时,反爬机制也可以防止竞争对手通过爬虫获取网站的商业机密和竞争优势。

2. 服务器如何区分浏览器访问和爬虫访问

服务器可以通过多种方式来识别是人手动访问网站还是爬虫程序访问网站。

  1. User-Agent:每个浏览器或爬虫程序都有一个User-Agent标识,服务器可以通过检查User-Agent来判断访问者是人还是爬虫程序。

  2. IP地址:服务器可以通过检查访问者的IP地址来判断是否是爬虫程序。一些爬虫程序使用大量的IP地址进行访问,而人类用户通常只使用一个或几个IP地址。

  3. 访问频率:爬虫程序通常会以非常高的频率访问网站,而人类用户通常不会如此频繁地访问网站。服务器可以通过检查访问频率来判断是否是爬虫程序。

  4. 访问行为:爬虫程序通常会按照一定的规律进行访问,例如按照页面顺序进行访问或者按照特定的关键词进行搜索。服务器可以通过检查访问行为来判断是否是爬虫程序。

3. 反爬虫机制

所谓上有政策,下有对策。

服务器可以通过多种方式来识别是人手动访问网站还是爬虫程序访问网站,但是一些高级的爬虫程序可以模拟人类用户的行为,使得服务器难以区分。

Python的反爬虫机制主要包括以下几种:

  1. User-Agent检测:有些网站会检测请求头中的User-Agent字段,如果发现是Python的默认User-Agent,就会拒绝访问。解决方法是在请求头中添加一个随机的User-Agent。

  2. IP封禁:有些网站会根据IP地址来限制访问频率或者直接封禁IP。解决方法是使用代理IP或者使用分布式爬虫。

  3. 验证码识别:有些网站会在登录或者访问频率过高时出现验证码,需要手动输入才能继续访问。解决方法是使用第三方验证码识别服务或者手动输入验证码。

  4. 访问频率限制:有些网站会限制同一IP或同一用户的访问频率,如果超过一定次数就会拒绝访问。解决方法是控制访问频率或者使用分布式爬虫。

  5. 动态页面爬取:有些网站使用了动态页面技术,需要使用Selenium等工具模拟浏览器行为才能爬取。

4. User-Agent是什么

User-Agent是一个HTTP头部字段,用于标识发送HTTP请求的客户端应用程序或设备的信息。

它通常包含了操作系统、浏览器、设备类型、应用程序版本等信息,以便服务器能够根据这些信息来优化响应内容或提供适当的服务。

例如,网站可以根据User-Agent识别访问者使用的设备类型和浏览器版本,从而提供适合的网页布局和功能。

User[ˈjuːzə]:用户。

Agent[ˈeɪdʒənt]:代理人。

User-Agent用户代理,简称UA。

无论是浏览器发出的请求,还是爬虫发出的请求,都会包含请求头。

请求头里有一个非常重要的信息,User-Agent。

5. 如何查询网页的User-Agent

  1. 打开360浏览器。

  2. 按【F12】打开开发者工具。

  3. 点击【网络】选项卡。

  4. 点击【全部】选项卡。

  5. 【Ctrl+R】刷新网页。

  6. 点击【名称】下方的内容。

  7. 点击【标头】。

  8. 向下滑动鼠标,找到【请求标头】。

在这里插入图片描述

  1. 【请求标头】的最后一项信息就是【user-agent】

  2. 将整个【user-agent】复制到文件(doc或txt或py文件等等都可以)来备用。

在这里插入图片描述

6. user-agent信息解析

user-agent中包含许多信息,用户使用的操作系统、CPU类型、浏览器版本等等。

【复制的user-agent内容如下】

user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE

【user-agent信息解析如下】

操作系统:Windows NT 10.0

  • CPU 架构:WOW64
  • 浏览器内核:AppleWebKit/537.36
  • 浏览器类型:Chrome
  • 浏览器版本:108.0.5359.95
  • 浏览器标识:Safari/537.36
  • 来源:QIHU 360SE解析

在每次浏览器发送请求的时候,UA字符串都会被发送到服务器上。

服务器会根据UA信息,显示不同的网页排版,以适应不同的用户浏览器。

同时,服务器还可以通过UA信息,侦察客户端的请求是否安全。

判断请求访问的是爬虫程序还是普通用户。

7. 爬虫程序user-agent和浏览器user-agent的区别

爬虫程序里的user-agent和浏览器里的user-agent的主要不同在于:

  1. 目的不同:浏览器的user-agent是为了告诉服务器它所使用的浏览器类型和版本,以便服务器能够返回适合该浏览器的网页内容;而爬虫程序的user-agent是为了模拟浏览器行为,以便获取网页内容。

  2. 内容不同:浏览器的user-agent通常包含浏览器类型、版本、操作系统类型和版本等信息;而爬虫程序的user-agent通常只包含爬虫程序的名称和版本号等信息。

  3. 格式不同:浏览器的user-agent通常是一个字符串,包含多个信息,格式比较复杂;而爬虫程序的user-agent通常是一个简单的字符串,格式比较简单。

8. 代码查看爬虫程序的user-agent

我们通过一个测试网站来查看爬虫程序的user-agent的包含的信息。

【测试网站】

url = "http://httpbin.org/get"

【代码示例】

# 1.导入库
# requests是第三方库,作用是发送发送GET、POST、PUT、DELETE等请求
import requests

# 2.要访问的url
url = "http://httpbin.org/get"

# 3.发送请求,并把响应结果赋值给变量r
r = requests.get(url)  

# 输出r的文本信息
print(r.text)

【终端输出】

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.26.0", 
    "X-Amzn-Trace-Id": "Root=1-6482e247-021e317204e5813568df0582"
  }, 
  "origin": "112.113.185.64", 
  "url": "http://httpbin.org/get"
}

上面输出的结果就爬虫程序里包含的user-agent。

观察输出结果,看到打印出来的 User-Agent的信息标志的是python-requests/2.26.0

信息里没有操作系统,也没有浏览器版本。

所以我们通过上面的代码访问网页,服务器是能识别出是爬虫代码在访问,而不是人工在访问。

这样的User-Agent会被反爬机制轻易拦截。

既然爬虫程序是因为User-Agent被识别出来的。

那解决这个问题,我们只需要把爬虫的User-Agent伪装成浏览器请求头里的User-Agent即可。

狼怎么伪装成羊呢?

狼可以用毛皮或其他材料制作成羊的外表。

披着羊皮的狼,和爬虫程序加入请求头信息(User-Agent)就是一个道理。

9. 在代码中加入请求头信息

requests库的get方法提供了headers参数。

headers:请求头。

headers参数的类型是字典。

headers参数的类型是字典。

headers参数的类型是字典。

作用是接收自定义的请求头。

【初学者可以这样构建请求头信息】

  1. 先构建一个字典
header = {}

header是变量名。

{}表示字典。

  1. 在大括号中间输入【回车】,输入'':''字符,准备好字典的框架。
header = {
    '':''
}

这里添加引号是因为这里字典的键和值都是字符串类型。

  1. 填充字典的键和值。
header = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) +\
      AppleWebKit/537.36 (KHTML, like Gecko)+\
         Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE'
}

user-agent是字典的键。

后面的具体信息作为值。

因为请求头字符多,字典格式很多初学者掌握的不熟练,复制请求头信息时太容易出错了。

初学者用上面的方法可以避免出错。

然后在requests发送请求时将请求头信息及header变量作为值传递给get函数的参数headers

r = requests.get(url,headers = header )  

headers是get函数的参数,是不可以换成其他名字的。

header是存储请求头信息的变量名,名字你可以自己命名。

【测试加入请求头的user-agent】

# 1.导入库
# requests是第三方库,作用是发送发送GET、POST、PUT、DELETE等请求
import requests

# 2.要访问的url,这个是测试网址
url = "http://httpbin.org/get"

# 3. 浏览器的请求头信息
header = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) +\
      AppleWebKit/537.36 (KHTML, like Gecko)+\
         Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE'
}

# 4.发送请求,并把响应结果赋值给变量r
r = requests.get(url, headers= header )  

# 5. 输出r的文本信息
print(r.text)

【终端输出】

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE", 
    "X-Amzn-Trace-Id": "Root=1-648348bd-2aadd11662bf3bad3c052f78"
  }, 
  "origin": "112.113.185.64", 
  "url": "http://httpbin.org/get"
}

大家观察输出结果。

【添加 "User-Agent"访问网页服务器识别的 "User-Agent"是下面这样的】

“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE”,

【没有 "User-Agent"访问网页服务器识别的 "User-Agent"是下面这样的】

“User-Agent”: “python-requests/2.26.0”

我们发现通过添加User-Agent我们将爬虫程序的请求头伪装成功了。

添加一个字典变量,我们成功的将狼伪装成了羊。

下面,我们以访问百度网页为例,写一个带请求头的访问网页代码。

【代码示例】

# 1.导入库
# requests是第三方库,作用是发送发送GET、POST、PUT、DELETE等请求
import requests

# 2.要访问的url
url = 'https://www.baidu.com/'

# 3. 浏览器的请求头信息
header = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) +\
      AppleWebKit/537.36 (KHTML, like Gecko) +\
        Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE'
}

# 4.发送请求,并把响应结果赋值给变量r
r = requests.get(url, headers= header )  

# 5.输出Response对象的status_code属性
print(r.status_code)

# 6. 查看r的类型
print(type(r))

【终端输出】

200
<class 'requests.models.Response'>

200表示访问网页成功。

<class 'requests.models.Response'>表示返回的r是一个requests.models类的响应对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wkhtmltopdf踩坑记录

1. 不支持writing-mode。 需求是文字纵向排列&#xff0c;内容从左到右&#xff0c;本来用的是writing-mode: tb-rl;&#xff0c;插件转pdf后发现失效。 解决方法&#xff1a; 让每一列文字单独用一个div容器包裹&#xff0c;对它的宽度进行限制&#xff0c;控制每一行只能出现…

MySQL 搭建数据库表

创建MySQL数据表需要以下信息&#xff1a; 表名表字段名定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法&#xff1a; CREATE TABLE table_name (column_name column_type); 复制 以下例子中我们将在 RUNOOB 数据库中创建数据表runoob_tbl&#xff1a; CREATE …

2023第十六届“认证杯”数学建模网络挑战赛第一阶段比赛经历分享

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大二在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

【C++】特殊类

目录 前言 一、设计一个类&#xff0c;不能被拷贝 C98方法 C11方法 二、设计一个类&#xff0c;只能在堆上创建对象 方法一 方法二 三、设计一个类&#xff0c;只能在栈上创建对象 方法一 方法二 四、设计一个类&#xff0c;不能被继承 C98方式 C11方法 五、设计…

darknet yolo标注、训练详细说明

文章目录 1、标注数据1.1、标注1.2、生成训练列表文件train.txt1.3、转换数据标注格式 2、训练数据整理2.1、修改train.txt路径2.2、修改yolov3.cfg2.3、obj.name和obj.data2.4、训练脚本文件trian.sh2.5、测试脚本文件test.sh 3、训练 本文对应的脚本文件和程序下载链接 darke…

chatgpt赋能python:Python如何保存成文件

Python如何保存成文件 Python是一种十分强大和流行的编程语言&#xff0c;它的灵活性和易于使用使得它成为了一个应用广泛的语言。在Python中&#xff0c;我们可以使用多种方式将编写的代码保存成文件&#xff0c;从而能够实现对需要的内容的复用和分享。本文将会介绍Python中…

利用谷歌DevTool解决web网页内存泄漏问题

目录 web网页内存泄漏 主要的内存泄漏来源 利用谷歌DevTool定位内存泄漏问题 性能Performance 主要功能 Performance insights性能数据分析 Memory内存 三种模式 相关概念 解决内存泄漏问题 第一步 &#xff1a;是否内存泄漏&#xff1a;js堆直增不降&#xff1b;降…

001Mybatis常用的网站及工具

MyBatis中文网https://mybatis.net.cn/ MyBatis Dynamic SQL – MyBatis Dynamic SQLhttps://mybatis.org/mybatis-dynamic-sql MyBatis GitHubMyBatis has 37 repositories available. Follow their code on GitHub.https://github.com/mybatis/ mybatis-spring-boot-auto…

探究Jetpack(二)之LiveData

目录 LiveData的基本用法比较安全的LiveData使用方法map和switchMapmapswitchMap LiveData是Jetpack提供的一种响应式编程组件&#xff0c;它可以包含任何类型的数据&#xff0c;并在数据发生变化的时候通知给观察者 LiveData特别适合与ViewModel结合在一起使用&#xff0c;虽然…

大数据Doris(三十七):Spark Load导入HDFS数据

文章目录 Spark Load导入HDFS数据 一、准备HDFS数据 二、创建Doris表 三、创建Spark Load导入任务

C语言编程—常量

常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;比如整数常量、浮点常量、字符常量&#xff0c;或字符串字面值&#xff0c;也有枚举常量。 常量就像是常规的变量&#xff0c;只不过常量…

云原生系列一:Aeraki --- 管理 Istio 服务网格中任何 7 层协议

导语:Aeraki Mesh 是 CNCF 的沙箱项目,它可以帮助你在服务网格中管理任何七层协议。 今天由叶秋学长来介绍如何通过 Aeraki 来在服务网格中为 Dubbo、Thrift 等协议的服务提供七层流量路由、本地限流、全局限流,以及如何基于 Aeraki Protocol快速开发一个自定义协议,并在 I…

CKA 06_Kubernetes 工作负载与调度 Pod 管理 yaml 资源清单 标签 Pod 生命周期 容器探针

工作负载与调度 1. Pod 管理1.1 kubectl 命令 2. yaml 资源清单2.1 yaml 文件的格式2.2 编写 yaml 资源清单 3. 标签3.1 节点标签选择器 考试题目&#xff1a;pod 中运行 nginx 和 memcache 容器4. Pod 生命周期4.1 Init 容器 5. 容器探针5.1 探测类型5.2 配置存活、就绪和启动…

驱动进化之路:总线设备驱动模型

了解总线设备驱动模型之前&#xff0c;可以先了解常规驱动程序的编写&#xff1a; LED驱动程序框架 驱动设计的思想&#xff1a;面向对象/分层/分离&#xff08;以LED操作为例&#xff09; 此次总线设备驱动模型程序的编写基于上述两种框架。 1. 总线设备驱动模型框架 在led_d…

STM32开发——串口通讯(非中断+中断)

目录 1.串口简介 2.非中断接收发送字符 3.中断接收字符 1.串口简介 通过中断的方法接受串口工具发送的字符串&#xff0c;并将其发送回串口工具。 串口发送/接收函数&#xff1a; HAL_UART_Transmit(); 串口发送数据&#xff0c;使用超时管理机制HAL_UART_Receive(); 串口…

虚拟机中Ubuntu不知root密码时设置唯一的非root用户为sudo管理员

刚才在虚拟机中玩Ubuntu的时候&#xff0c;在Cockpit管理页面把账号“服务器管理员”的选项给取消了&#xff0c;然后重新登录之后&#xff0c;就不能执行sudo指令了&#xff0c;所有需要root权限才能访问的文件&#xff08;目录&#xff09;、执行的命令全部都不行了。 执行s…

数据传输中的数据转换与处理的常用方法-物联网开发-单片机通信

目录 一、前言 二、实践与代码 1.Unsigned Char 2.memset 3.sprintf 4.atoi 5.atof 6.strcmp 7.strtok 8.strlen 9.strcpy 10.strcat 三、总结 一、前言 本文将以STM32单片机为基础&#xff0c;使用Keil5环境展示以下方法。 在单片机通信、载波通信中&#xff0c;常常涉及数…

【Laravel 6】安装需要什么环境?又怎么安装呢

服务器要求 服务器满足以下要求&#xff1a; PHP > 7.2.5BCMath PHP 拓展Ctype PHP 拓展JSON PHP 拓展Mbstring PHP 拓展OpenSSL PHP 拓展PDO PHP 拓展Tokenizer PHP 拓展XML PHP 拓展 安装Laravel Laravel 使用 Composer 来管理项目依赖。因此&#xff0c;在使用 Larav…

JDK动态代理和cglib代理

文章目录 前言1.JDK动态代理1.1 定义一个接口1.2 实现接口1.3 自定义MyInvocationHandler去实现InvocationHandler接口1.4 测试jdk代理1.5 输出代理类 2.cglib代理2.1 代理接口类2.2 代理普通类2.3 设置属性生成cglib代理类 前言 动态代理在平时的开发中用的也很多&#xff0c…

算法与数据结构(五)

一、c二叉树结构 typedef struct BiNode {int data; //结点内值域struct BiNode* lchild, * rchild; //左孩子 右孩子 } BiNode, * BiTree;或者&#xff1a; class Node { public:char data;// data表示该节点代表的内容&#xff1b;Node* L;//左子树Node* R;//右子树 }; No…