当前位置: 首页 > news >正文

解决selenium爬虫被浏览器检测问题

在这里插入图片描述

文章目录

  • 专栏导读
  • 1.问题解析
  • 2.代码解析(Edge/Chrome通用)
    • 2.1 设置Edge浏览器选项:
    • 2.2 尝试启用后台模式
    • 2.3 排除启用自动化模式的标志
    • 2.4 禁用自动化扩展
    • 2.5 设置用户代理
    • 2.6 实例化浏览器驱动对象并应用配置
    • 2.7 在页面加载时执行JavaScript代码
  • 3.完整代码(可直接复制使用)

专栏导读

✍ 作者简介:i阿极,CSDN 数据分析领域优质创作者,专注于分享python数据分析领域知识。
✍ 其他专栏:《数据分析案例》 ,《机器学习案例》

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

1.问题解析

对于selenium模拟网页登录被检测到的原因,很多博主大佬对此都有其解释。这里就不再阐述。
但是为了让本博主和小伙伴们方便并快速找到原因,以下是AI给出的答案:

使用Selenium爬虫被检测到的原因主要有以下几点:

  1. 请求头信息差异
    默认请求头差异:Selenium在默认情况下发送的请求头信息与真实浏览器略有不同,这可能导致服务器识别出非人类访问。例如,Selenium的WebDriver在发送请求时,可能会包含特定的标识(如window.navigator.webdriver),这些标识可以被网站用来检测是否使用了自动化工具。
    可定制性不足:虽然Selenium允许自定义请求头,但相比真实浏览器,其请求头可能缺乏足够的“人性化”信息,如referer字段、用户代理(User-Agent)字符串的多样性等。
  2. 访问模式异常
    访问频率过高:Selenium爬虫通常具有较高的访问频率,这与人类用户的访问行为存在显著差异。如果爬虫在短时间内对同一网站进行大量请求,很容易被服务器识别为异常行为。
    行为模式固定:由于Selenium爬虫是程序化操作,其行为模式相对固定,如固定的点击顺序、输入速度等,这与人类用户的随机性操作形成对比,增加了被检测的风险。
  3. 浏览器指纹差异
    浏览器指纹:每个浏览器都有其独特的指纹信息,包括操作系统、浏览器版本、插件列表等。Selenium爬虫通常使用单一的浏览器配置进行大量请求,这可能导致其浏览器指纹与大多数真实用户不同,从而被网站识别。
  4. 其他反爬虫机制
    IP地址限制:如果Selenium爬虫频繁使用同一IP地址进行访问,该IP地址可能会被网站加入黑名单,从而限制或封禁其访问。
    Cookie验证:部分网站在登录后会在每个请求中要求携带相关的Cookie信息,如果Selenium爬虫无法正确处理这些Cookie,也可能导致被检测。
  5. 应对措施
    为了减少Selenium爬虫被检测的风险,可以采取以下措施:
    自定义请求头:尽可能模拟真实浏览器的请求头信息,包括User-Agent、referer等字段。
    设置合理的访问间隔:在请求之间设置随机间隔时间,模拟人类的自然访问规律。
    使用代理IP:通过代理IP进行访问,隐藏真实的IP地址,避免被服务器封禁。
    修改WebDriver属性:通过修改Selenium WebDriver的默认属性,如禁用window.navigator.webdriver标识,减少被检测的风险。
    模拟用户行为:在爬虫中加入模拟用户行为的元素,如随机点击、滚动页面等,使爬虫行为更接近真实用户。

2.代码解析(Edge/Chrome通用)

2.1 设置Edge浏览器选项:

option = webdriver.EdgeOptions()

这行代码创建了一个EdgeOptions对象,该对象用于配置Microsoft Edge浏览器的启动选项。这是在使用Selenium与Edge浏览器交互时的第一步。

2.2 尝试启用后台模式

option.add_experimental_option("detach", True)

这行代码尝试通过添加实验性选项"detach"并设置为True来让浏览器在后台运行。然而,需要注意的是,"detach"并不是Selenium官方支持的Edge浏览器选项,且其效果可能因Selenium版本和浏览器实现而异。在某些情况下,这个选项可能不起作用或不被识别。

2.3 排除启用自动化模式的标志

option.add_experimental_option("excludeSwitches", ["enable-automation"])

这行代码通过添加实验性选项"excludeSwitches"并传入一个包含"enable-automation"的列表来尝试隐藏自动化痕迹。"enable-automation"是一个Chrome(及可能也适用于Edge,因为它们共享很多相同的命令行选项)的标志,用于启用自动化模式,该模式可能会改变浏览器的行为或允许网站检测到自动化。

2.4 禁用自动化扩展

option.add_experimental_option("useAutomationExtension", False)

这行代码通过设置"useAutomationExtension"为False来禁用Selenium的自动化扩展。这个扩展可能会暴露Selenium的存在,从而被网站检测到。

2.5 设置用户代理

option.add_argument(  "User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46")

这行代码通过add_argument方法添加一个命令行参数来设置浏览器的用户代理(User-Agent)。用户代理是一个在HTTP请求中发送的头部,用于告诉服务器客户端的操作系统、浏览器版本等信息。这里设置为一个模拟Chrome浏览器的用户代理,以尝试绕过一些基于用户代理的检测。

2.6 实例化浏览器驱动对象并应用配置

driver = webdriver.Edge(options=option)

这行代码使用之前配置的EdgeOptions对象(option)来实例化一个Edge浏览器的WebDriver对象。这个WebDriver对象将用于控制Edge浏览器进行自动化测试或爬虫操作。

2.7 在页面加载时执行JavaScript代码

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {  "source": """  Object.defineProperty(navigator, 'webdriver', {  get: () => undefined  })  """  
})

这行代码使用Chrome DevTools Protocol(CDP)的Page.addScriptToEvaluateOnNewDocument命令来在页面加载时自动执行一段JavaScript代码。这段代码通过Object.defineProperty方法重写了navigator.webdriver属性,使其getter函数返回undefined。这样做可以隐藏Selenium的存在,因为一些网站可能会通过检查navigator.webdriver属性来判断是否在使用自动化工具。这是绕过网站自动化检测的一种常用方法。

3.完整代码(可直接复制使用)

option = webdriver.EdgeOptions()
option.add_experimental_option("detach", True)
option.add_experimental_option("excludeSwitches", ["enable-automation"])
option.add_experimental_option("useAutomationExtension", False)
option.add_argument("User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46")
# 实例化浏览器驱动对象,并将配置浏览器选项
driver = webdriver.Edge(options=option)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""
})

📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [第一章]java快速入门
  • 6.C_数据结构_查询_哈希表
  • 【深度学习 Transformer VIT】Transformer VIT:拆解“视觉变形金刚”,笑谈技术细节
  • 十种果冻的做法
  • 生信初学者教程(四):软件
  • 一起对话式学习-机器学习03——模型评估与模型选择
  • 中电信翼康基于Apache Dolphinscheduler重构“星海·济世医疗数据中台”实践经验分享
  • 【网络通信基础与实践第四讲】用户数据报协议UDP和传输控制协议TCP
  • JavaWeb纯小白笔记02:Tomcat的使用:发布项目的三种方式、配置虚拟主机、配置用户名和密码
  • 什么是上层建筑?
  • 局域网共享文件夹:您没有权限访问,请与网络管理员联系
  • Vue vs React vs Angular 的对比和选择
  • LD3320语音识别模块的简单应用
  • 机器翻译之创建Seq2Seq的编码器、解码器
  • C++11——function与bind
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • css选择器
  • JavaScript设计模式系列一:工厂模式
  • jquery ajax学习笔记
  • Laravel5.4 Queues队列学习
  • SAP云平台里Global Account和Sub Account的关系
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 阿里云Kubernetes容器服务上体验Knative
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 使用Swoole加速Laravel(正式环境中)
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • "无招胜有招"nbsp;史上最全的互…
  • #、%和$符号在OGNL表达式中经常出现
  • #pragma multi_compile #pragma shader_feature
  • #控制台大学课堂点名问题_课堂随机点名
  • $.ajax()
  • (07)Hive——窗口函数详解
  • (八)Flask之app.route装饰器函数的参数
  • (第30天)二叉树阶段总结
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (转)ObjectiveC 深浅拷贝学习
  • ***通过什么方式***网吧
  • .gitignore文件---让git自动忽略指定文件
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @在php中起什么作用?
  • [ Linux ] Linux信号概述 信号的产生
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • []T 还是 []*T, 这是一个问题
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [04] Android逐帧动画(一)
  • [2016.7 day.5] T2
  • [5] CUDA线程调用与存储器架构
  • [C#][DevPress]事件委托的使用
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】