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

文章目录

  • 专栏导读
  • 1.问题解析
  • 2.代码解析(Edge/Chrome通用)
    • [2.1 设置Edge浏览器选项:](#2.1 设置Edge浏览器选项:)
    • [2.2 尝试启用后台模式](#2.2 尝试启用后台模式)
    • [2.3 排除启用自动化模式的标志](#2.3 排除启用自动化模式的标志)
    • [2.4 禁用自动化扩展](#2.4 禁用自动化扩展)
    • [2.5 设置用户代理](#2.5 设置用户代理)
    • [2.6 实例化浏览器驱动对象并应用配置](#2.6 实例化浏览器驱动对象并应用配置)
    • [2.7 在页面加载时执行JavaScript代码](#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浏览器选项:

python 复制代码
option = webdriver.EdgeOptions()

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

2.2 尝试启用后台模式

python 复制代码
option.add_experimental_option("detach", True)

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

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

python 复制代码
option.add_experimental_option("excludeSwitches", ["enable-automation"])

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

2.4 禁用自动化扩展

python 复制代码
option.add_experimental_option("useAutomationExtension", False)

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

2.5 设置用户代理

python 复制代码
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 实例化浏览器驱动对象并应用配置

python 复制代码
driver = webdriver.Edge(options=option)

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

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

python 复制代码
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.完整代码(可直接复制使用)

python 复制代码
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博客 ,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒

📢你的支持和鼓励是我创作的动力❗❗❗

相关推荐
不做超级小白1 小时前
工欲善其事,必先利其器;爬虫路上,我用抓包
爬虫
Smartdaili China1 小时前
如何在 Microsoft Edge 中设置代理: 快速而简单的方法
前端·爬虫·安全·microsoft·edge·社交·动态住宅代理
好看资源平台4 小时前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
明明跟你说过5 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
Tech Synapse17 小时前
Python网络爬虫实践案例:爬取猫眼电影Top100
开发语言·爬虫·python
惜.己17 小时前
Jmeter中的断言(二)
测试工具·jmeter·1024程序员节
数据小爬虫@18 小时前
利用Python爬虫获取淘宝店铺详情
开发语言·爬虫·python
互联网杂货铺1 天前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
B站计算机毕业设计超人1 天前
计算机毕业设计SparkStreaming+Kafka新能源汽车推荐系统 汽车数据分析可视化大屏 新能源汽车推荐系统 汽车爬虫 汽车大数据 机器学习
数据仓库·爬虫·python·数据分析·kafka·数据可视化·推荐算法