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

news2024/11/13 12:19:07

在这里插入图片描述

文章目录

  • 专栏导读
  • 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博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

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

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

相关文章

[ IDE ] SEGGER Embedded Studio for RISC-V

一、FILE 二、Edit 三、View 四、Search 五、Navigate 六、Project 七、Build 7.1 编译 先选择一个目标类型,再选择编译。 八、Debug 九、Target 十、Tools 10.1 自定义快捷键 点击菜单项,通过Tools –> Options –> Keyboard,实现自…

初识Linux · 环境变量

目录 前言: 命令行参数 环境变量 直接看现象 更多的环境变量 尝试理解环境变量 前言: 今天介绍的是一个较为陌生的名词,环境变量,在学习环境变量之前,我们需要一定的预备知识,这个预备知识是命令行参…

HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录 1、基本概念2、运行机制3、默认配置与限制4、接口说明5、实战:开发“账本”5.1、创建RdbStore5.2、创建数据库5.3、增加数据5.4、删除数据5.5、修改数据5.6、查询数据5.7、备份数据库5.8、恢复数据库5.9、删除数据库 官方文档地址: 通过关系型…

堆的向下调整算法和TOPK问题

目录 1.什么是堆? 1.1 向下调整建堆的时间复杂度计算 1.2 堆的结构体设计 2.堆的功能实现: 2.1 堆的插入: 2.2 堆的删除: 2.3 堆排序: 2.4 向下调整建堆: 2.5 TOPK问题: 2.6 向上调整算…

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

文章目录 前言准备工作获取第三方授权权限与授权配置信息集成金蝶云SDK调用实现备注前言 对于有自己商品信息管理后台并且使用金蝶ERP系统管理物料的商家来说,将金蝶上物料的库存信息同步到管理后台就可以不用去金蝶上确认库存了,可以大大简化管理后台的库存变更工作,这篇文…

Call OpenAI API with Python requests is missing a model parameter

题意:使用 Python requests 调用 OpenAI API 时缺少 model 参数。 问题背景: Im trying to call OpenAI API from Python. I know they have their own openai package, but I want to use a generic solution. I chose the requests package for its f…

通义千问重磅开源Qwen2.5,性能超越Llama

Qwen2.5 新闻 9月19日云栖大会,阿里云CTO周靖人发布通义千问新一代开源模型Qwen2.5,旗舰模型Qwen2.5-72B性能超越Llama 405B,再登全球开源大模型王座。Qwen2.5全系列涵盖多个尺寸的大语言模型、多模态模型、数学模型和代码模型,每…

TransUNet: 通过Transformer的视角重新思考U-Net架构在医学图像分割中的设计|文献速递-Transformer架构在医学影像分析中的应用

Title 题目 TransUNet: Rethinking the U-Net architecture design for medical imagesegmentation through the lens of transformers TransUNet: 通过Transformer的视角重新思考U-Net架构在医学图像分割中的设计 01 文献速递介绍 卷积神经网络(CNNs&#xff…

计算机毕业设计之:教学平台微信小程序(

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

生信初学者教程(四):软件

文章目录 RRstudioLinux系统其他软件本书是使用R语言编写的教程,用户需要下载R和RStudio软件用于进行分析。 版权归生信学习者所有,禁止商业和盗版使用,侵权必究 R R语言是一种免费的统计计算和图形化编程语言,是一种用于数据分析和统计建模的强大工具。它具有丰富的统计…

CSP-CCF★201912-2回收站选址★

一、问题描述 二、解答 代码&#xff1a; #include<iostream> #include<map> using namespace std; struct rubbish{int x;int y; }rub[1000]; int n; void input(){cin>>n;for(int i0;i<n;i){cin>>rub[i].x>>rub[i].y;} } bool has(int p,…

【machine learning-八-可视化loss funciton】

可视化lossfunction loss funciton可视化损失函数等高图 loss funciton 上一节讲过损失函数&#xff0c;也就是代价函数&#xff0c;它是衡量模型训练好坏的指标&#xff0c;对于线性回归来说&#xff0c;模型、参数、损失函数以及目标如下&#xff1a;、 损失函数的目标当然…

什么品牌超声波清洗机质量好?四大绝佳超声波清洗机品牌推荐!

在快节奏的现代生活中&#xff0c;个人物品的清洁卫生显得至关重要。眼镜、珠宝饰品、手表乃至日常餐厨用具&#xff0c;这些频繁接触的物品极易累积污渍与细菌。拿眼镜为例&#xff0c;缺乏定期清洁会让油渍与尘埃积累&#xff0c;进而成为细菌的温床&#xff0c;靠近眼睛使用…

SCDN是服务器吗?SCDN防御服务器有什么特点?

SCDN确实具有一定的防DDoS攻击能力&#xff0c;SCDN防御服务器有什么特点&#xff1f;高防SCDN通过结合内容分发网络&#xff08;CDN&#xff09;和分布式拒绝服务&#xff08;DDoS&#xff09;防护技术&#xff0c;提供了更全面的网络保护措施。在充满网络攻击的互联网时代&am…

dev c++输出中文乱码解决 printf乱码解决

把编码换成utf8就行 打开eiditor options

左手研发,右手销量,比亚迪舍弃了什么?

早买早享受&#xff0c;晚买享折扣&#xff0c;是近一年来汽车消费市场的真实写照。 A级家轿价格下探至6、7万元&#xff1b;曾经20万起步的主流B级车&#xff0c;如今只要12万元就能入手&#xff1b;即使是BBA等豪华品牌&#xff0c;也开始降价促销换销量。买车更便宜了&…

乐观锁、悲观锁

一、悲观锁 悲观锁 (Pessimistic Locking)&#xff0c;具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度。因此&#xff0c;在整个执行过程中&#xff0c;将处于锁定状态。所以&#xff0c;悲观锁是一种悲观思想&#xff0c;它总认为最坏的情况可能会出现&#x…

【Elasticsearch系列十五】强大特性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

没想到【C# ASP.NET + Vue】也能打造如此强大的健身房管理系统!告别传统管理,体验智能化的会员服务,课程安排竟然如此简单

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

多模态文档理解:一文读懂mPLUG-DocOwl系列模型

〔探索AI的无限可能&#xff0c;微信关注“AIGCmagic”公众号&#xff0c;让AIGC科技点亮生活〕 本文作者&#xff1a;AIGCmagic社区 刘一手 前言 随着人工智能技术的发展&#xff0c;多模态大型语言模型&#xff08;MLLMs&#xff09;在视觉-文本理解领域取得了显著进展。m…