Selenium模拟人类行为,操作网页的方法(全)

看到有朋友评论问,用selenium怎么模仿人类行为,去操作网页的页面呢?

我想了想,这确实是一个很大的点,不应该是一段代码能解决的,

就像是,如果让程序模拟人类的行为。例如模拟人类买菜,做饭,吃饭,聊天,蹲坑等

这个过程中最重要的不是结果,不是程序能不能完成这些事,而是做这些事的时候,能不能尽可能地像个人在做的,然后尽力躲过网络警察的审查。

selenium的优势是在于它的休眠机制、可以模拟真实的浏览器指纹,模拟鼠标移动的行为轨迹、处理复杂交互等,可以降低被检测和封锁的风险。

具体的模拟应该要分不同的情况来,以下是一些整理:

1. 配置selenium的浏览器界面

在运行下面的方法前,先把selenium 配置好,尽量多一些selenium的配置,用来绕过监测,下面的简单的写法,严谨一点的话,可以如2、3、4的写法,加上用户代理和禁用自动化特征、防检测的header头写法等:

from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsoptions = Options()
options.add_argument("--window-size=1920,1080")  # 设置浏览器窗口大小
options.add_argument("--disable-blink-features=AutomationControlled")  # 禁用自动化控制特征
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")  # 设置用户代理
driver = webdriver.Chrome(options=options)#加上头的写法

2. 使用代理IP

我们在访问其他网站的时候,使用自己的服务器地址,向对方的网站打个招呼,这个时候会暴露自己的IP地址,就像打电话给别人一样,我们的电话号码也会暴露给了对方。如果频繁地向对方一直打招呼,就容易被对方视作垃圾号码一样拉黑

这就跟被人标记成垃圾号码一样被对方封了,这个是封IP;现在很多人会用虚拟号码去频繁地打电话给别人,哪怕别人拉黑了这个号码,也拉黑不了下一个。因为每次打出去的号码都是新的虚拟的号

做代理IP就像是给自己的电脑IP,包装多个虚拟号码一样的外壳, 这样可以保障自己在频繁地访问一个网站的时候,不会轻易被拉黑了。

from selenium import webdriverPROXY = "123.456.789.012:8080"  # 示例代理options = webdriver.ChromeOptions()
options.add_argument(f'--proxy-server={PROXY}')
driver = webdriver.Chrome(options=options)

这个代理ip有付费的网站,也有免费的网站,如果有需要,后期我会再整理各类的网站出来


3. 禁用自动化特征

在这里插入图片描述
有时候爬取的时候,会显示这样一行字,下面的方法是可以取消这行字的显示,将浏览器包装成非自动化测试的外壳。

options = Options()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options)

4. selenium上构造安全头header

请求头把自己的浏览器信息发送给对方服务器,有点像是给对方服务器递了个名片过去。

单一的header头,也会受到对方服务器的检测,有时候我们也可以有选择地构建安全头内容。

4.1 方法1:通过 add_argument 设置基础 Headers(简单但有限)

适用于修改 User-Agent 等基础头信息:

from selenium import webdriveroptions = webdriver.ChromeOptions()
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")
options.add_argument("--accept-language=en-US,en;q=0.9")driver = webdriver.Chrome(options=options)

局限性:仅支持部分预定义头(如 User-Agent、Accept-Language),无法添加自定义头(如 Authorization)。

4.2 方法2:使用 DevTools Protocol(推荐,完整控制)

动态的header构建,通过 Chrome DevTools 的 Network.setExtraHTTPHeaders 方法,注入任意 Headers:

from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()# 定义自定义 Headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)","Accept": "text/html,application/xhtml+xml","Authorization": "Bearer token123",  # 示例自定义头"X-Custom-Header": "MyValue"
}# 通过 DevTools 注入 Headers
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": headers})driver.get("https://example.com")

优点:支持所有自定义 Headers,适用于需要 Cookie、Referer 等复杂场景。

4.3 进阶的header头:使用undetected-chromedriver来构建

反爬会对部分网站会检测 Sec- 开头的安全头(如 Sec-Ch-Ua),需用 undetected-chromedriver 规避。


5.模拟鼠标移动与点击

我们在点击网页后,如果有一些交互的按钮,例如要移动到某个位置再点击之类的,我们可能会用find_element 定位元素再进行点击,

但是如果在防检测比较严格的情况下,例如对方浏览器对鼠标进行监控计算,会监测用户是鼠标是不是在移动,如果是上面的方法,这种就没法做到,这时候可以用到ActionChains来处理:

from selenium.webdriver.common.action_chains import ActionChains
import random
import timeelement = driver.find_element_by_id("some-id")# 模拟人类移动鼠标
actions = ActionChains(driver)
actions.move_to_element(element).perform()# 添加随机延迟
time.sleep(random.uniform(0.5, 2.5))# 模拟人类点击(先移动再点击)
actions.click(element).perform()

但是这种方法会一直占用鼠标的使用的,导致我们爬虫之余没法做其他的事情,处于下策,能不用就尽量不用。


6.模拟鼠标滚动的行为

我们在浏览页面的时候,会有滚动鼠标,看下滑的页面,下滑不是一直滑,而是会停一会,再下拉页面一会

即模拟人的人眼在看到页面后的反应,脑子会对眼球的视觉信息做处理,停留思考一会,这时候会有一个间隔的空隙,

这个空隙可以用随机休眠的方法处理:

import random# 随机滚动页面
scroll_pause_time = random.uniform(0.5, 1.5)
scroll_height = random.randint(200, 800)for i in range(random.randint(1, 5)):driver.execute_script(f"window.scrollBy(0, {scroll_height});") #用js模拟滚动鼠标的操作time.sleep(scroll_pause_time) #间隔休眠的时间

7.模拟浏览页面时,停留一些时间

人在浏览网页的时候,不会一直都无停留地一直切换不同的浏览器的网页,我们在不同的网页间切换,要随机增加一些睡眠,原理同上

import random# 不同页面间的随机等待
wait_times = [1, 1.5, 2, 2.5, 3, 4, 5]driver.get(url_1)
time.sleep(random.choice(wait_times))
driver.get(url_2)
time.sleep(random.choice(wait_times))

8. 模拟在输入框里输入文字的行为

在模拟人在手敲键盘的时候,模拟一个字一个字得打出来,

这个一字一顿,得用到字与字输出的休眠

这种方法的实现是for循环里打出一堆字的时候,在每个字之间增加随机的休眠,如:

from selenium.webdriver.common.keys import Keystext_field = driver.find_element_by_id("search-box")# 模拟人类打字速度
text_to_type = "example search query"
for char in text_to_type:text_field.send_keys(char)time.sleep(random.uniform(0.1, 0.3))  # 随机输入间隔# 随机等待后按回车
time.sleep(random.uniform(0.5, 1.5))
text_field.send_keys(Keys.RETURN)

9. 模拟人类错误与纠正

我们在打字的时候,有时候会写错字,需要删除内容,然后再重新输入

这个模拟写错又纠错的过程,如下:

# 模拟输入错误并纠正
search_box = driver.find_element_by_name("q")# 故意输入错误
search_box.send_keys("mistake")
time.sleep(random.uniform(0.5, 1.5))# 模拟退格删除
for _ in range(3):search_box.send_keys(Keys.BACK_SPACE)time.sleep(random.uniform(0.1, 0.3))# 输入正确内容
search_box.send_keys("correct term")

10. 标签页与窗口行为模拟

如果爬取时间比较长的话,我们一直在一个标签页的窗口上一直操作,也不太合理,要时不时打开新的标签页,进行处理

下面的方法是用概率来限制打开标签页的次数:

# 随机打开新标签页
if random.random() > 0.7:  # 30%概率打开新标签driver.execute_script("window.open('https://example.com');")time.sleep(random.uniform(1, 3))# 切换回原标签页driver.switch_to.window(driver.window_handles[0])time.sleep(random.uniform(0.5, 1.5))

11. 操作顺序随机化

一些可以点击的元素,不要按顺序一个个顺着去点,要调换顺序,随机去点,例如:在这里插入图片描述
写法:

actions = [lambda: driver.execute_script("window.scrollBy(0, 200);"),lambda: driver.find_element_by_link_text("About").click(),lambda: driver.back(),lambda: time.sleep(random.uniform(1, 2))
]random.shuffle(actions)
for action in actions[:random.randint(1, 3)]:action()time.sleep(random.uniform(0.5, 1.5))

12. 下载文件时,模拟网络条件限定速度

下载一些文件的时候,模拟网络的状态,设置下载的速度,不要太快,或者太频繁下载:

from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiescaps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {'performance': 'ALL'}
caps['networkConditions'] = {'offline': False,'latency': 100,  # 额外延迟(ms)'download_throughput': 500 * 1024,  # 最大下载速度'upload_throughput': 500 * 1024  # 最大上传速度
}
driver = webdriver.Chrome(desired_capabilities=caps)

在这里插入图片描述

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

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

相关文章

RabbitMQ的工作队列模式和路由模式有什么区别?

RabbitMQ 的工作队列模式(Work Queues)和路由模式(Routing)是两种不同的消息传递模式,主要区别在于消息的分发逻辑和使用场景。以下是它们的核心差异: 1. 工作队列模式(Work Queues&#xff09…

牛客练习赛138(首篇万字题解???)

赛时成绩如下: 1. 小s的签到题 小s拿到了一个比赛榜单,他要用最快的速度找到签到题,但是小s脑子还是有点晕,请你帮帮小s,助力他找到签到题。 比赛榜单是一个 2 行 n 列的表格: 第一行是 n 个大写字母&#…

linux0.11内核源码修仙传第十六章——获取硬盘信息及根目录挂载

🚀 前言 书接第十四章:linux0.11内核源码修仙传第十四章——进程调度之fork函数,在这一节博客中已经通过fork进程创建了一个新的进程1,并且可以被调度,接下来接着主线继续走下去。希望各位给个三连,拜托啦&…

mobile自动化测试-appium webdriverio

WebdriverIO是一款支持mobile app和mobile web自动化测试框架,与appium集成,完成对mobile应用测试。支持ios 和android两种平台,且功能丰富,是mobile app自动化测试首选框架。且官方还提供了mobile 应用测试example代码&#xff0…

Kubernetes排错(十):常见网络故障排查

通用排查思路 Kubernetes 集群内不同服务之间的网络通信出现异常,表现为请求超时、连接失败或响应缓慢,导致服务间依赖关系中断,依赖服务的功能不可用或性能下降,甚至可能波及整个微服务架构,引发连锁反应&#xff0c…

PyTorch 张量与自动微分操作

笔记 1 张量索引操作 import torch ​ # 下标从左到右从0开始(0->第一个值), 从右到左从-1开始 # data[行下标, 列下标] # data[0轴下标, 1轴下标, 2轴下标] ​ def dm01():# 创建张量torch.manual_seed(0)data torch.randint(low0, high10, size(4, 5))print(data->,…

接口的基础定义与属性约束

在 TypeScript 中,接口(Interface)是一个非常强大且常用的特性。接口定义了对象的结构,包括对象的属性和方法,可以为对象提供类型检查和约束。通过接口,我们可以清晰地描述一个对象应该具备哪些属性和方法。…

高效全能PDF工具,支持OCR识别

软件介绍 PDF XChange Editor是一款功能强大的PDF编辑工具,支持多种操作功能,不仅可编辑PDF内容与图片,还具备OCR识别表单信息的能力,满足多种场景下的需求。 软件特点 这款PDF编辑器完全免费,用户下载后直接…

OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorGMG

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::bgsegm::BackgroundSubtractorGMG 是 OpenCV 中用于背景分割的一个类,它实现了基于贝叶斯推理的背景建模算法(Bayesi…

MongoDB知识框架

简介:MongoDB 是一个基于分布式文件存储的数据库,属于 NoSQL 数据库产品,以下是其知识框架总结: 一、数据模型 文档:MongoDB 中的数据以 BSON(二进制形式的 JSON)格式存储在集合中,…

WEBSTORM前端 —— 第2章:CSS —— 第8节:网页制作2(小兔鲜儿)

目录 1.项目目录 2.SEO 三大标签 3.Favicon 图标 4.版心 5.快捷导航(shortcut) 6.头部(header) 7.底部(footer) 8.banner 9.banner – 圆点 10.新鲜好物(goods) 11.热门品牌(brand) 12.生鲜(fresh) 13.最新专题(topic) 1.项目目录 【xtx-pc】 ima…

1、RocketMQ 核心架构拆解

1. 为什么要使用消息队列? 消息队列(MQ)是分布式系统中不可或缺的中间件,主要解决系统间的解耦、异步和削峰填谷问题。 解耦:生产者和消费者通过消息队列通信,彼此无需直接依赖,极大提升系统灵…

[Linux网络_71] NAT技术 | 正反代理 | 网络协议总结 | 五种IO模型

目录 1.NAT技术 NAPT 2.NAT和代理服务器 3.网线通信各层协议总结 补充说明 4.五种 IO 模型 1.什么是IO?什么是高效的IO? 2.有那些IO的方式?这么多的方式,有那些是高效的? 异步 IO 🎣 关键缺陷类比…

Unity基础学习(八)时间相关内容Time

众所周知,每一个游戏都会有自己的时间。这个时间可以是内部,从游戏开始的时间,也可以是外部真实的物理时间,时间相关内容 主要用于游戏中 参与位移计时 时间暂停等。那么我们今天就来看看Unity中和时间相关的内容。 Unity时间功能…

Java游戏服务器开发流水账(1)游戏服务器的架构浅析

新项目立项停滞,头大。近期读老项目代码看到Java,笔记记录一下。 为什么要做服务器的架构 游戏服务器架构设计具有多方面的重要意义,它直接关系到游戏的性能、可扩展性、稳定性以及用户体验等关键因素 确保游戏的流畅运行 优化数据处理&a…

计算机视觉与深度学习 | 基于Transformer的低照度图像增强技术

基于Transformer的低照度图像增强技术通过结合Transformer的全局建模能力和传统图像增强理论(如Retinex),在保留颜色信息、抑制噪声和平衡亮度方面展现出显著优势。以下是其核心原理、关键公式及典型代码实现: 一、原理分析 1. 全局依赖建模与局部特征融合 Transformer的核…

Linux 文件目录管理常用命令

pwd 显示当前绝对路径 cd 切换目录 指令备注cd -回退cd …返回上一层cd ~切换到用户主目录 ls 列出目录的内容 指令备注ls -a显示当前目录中的所有文件和目录,包括隐藏文件ls -l以长格式显示当前目录中的文件和目录ls -hl以人类可读的方式显示当前目录中的文…

【Linux 系统调试】性能分析工具perf使用与调试方法

目录 一、perf基本概念 1‌. 事件类型‌ 2‌. 低开销高精度 3‌. 工具定位‌ 二、安装与基础配置 1. 安装方法 2. 启用符号调试 三、perf工作原理 1. 数据采集机制 2. 硬件事件转化流程 四、perf应用场景 1. 系统瓶颈定位 2. 锁竞争优化 3. 缓存优化 五、perf高级…

嵌入式中屏幕的通信方式

LCD屏通信方式详解 LCD屏(液晶显示屏)的通信方式直接影响其数据传输效率、显示刷新速度及硬件设计复杂度。根据应用场景和需求,LCD屏的通信方式主要分为以下三类,每种方式在协议类型、数据速率、硬件成本及适用场景上存在显著差异…

【el-admin】el-admin关联数据字典

数据字典使用 一、新增数据字典1、新增【图书状态】和【图书类型】数据字典2、编辑字典值 二、代码生成配置1、表单设置2、关联字典3、验证关联数据字典 三、查询操作1、模糊查询2、按类别查询(下拉框) 四、数据校验 一、新增数据字典 1、新增【图书状态…