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

该文章已生成可运行项目,

在这里插入图片描述

专栏导读

✍ 作者简介:i阿极,优快云 数据分析领域优质创作者,专注于分享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
            })
            """
})

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

本文章已经生成可运行项目
### 使用Selenium模拟登录网站并爬取受保护的数据 在数据爬取过程中,许多网站要求用户进行身份验证后才能访问特定内容。对于这类需要登录的网站,可以通过 **Selenium** 模拟浏览器操作来完成登录,并进一步抓取受保护的数据。 #### 1. 使用Selenium模拟登录的基本步骤 Selenium 是一个强大的工具,它能够控制浏览器自动化执行一系列操作,例如填写表单、点击按钮等。以下是使用 Selenium 进行模拟登录的一般流程: - 启动浏览器驱动(如 ChromeDriver)。 - 打开目标网站的登录页面。 - 定位用户名和密码输入框,并输入相应的凭证。 - 提交登录表单或点击登录按钮。 - 登录成功后,跳转到受保护页面并提取所需数据。 示例代码如下: ```python from selenium import webdriver from selenium.webdriver.common.by import By import time # 设置浏览器驱动路径 driver = webdriver.Chrome(executable_path='/path/to/chromedriver') # 打开登录页面 driver.get("https://example.com/login") # 等待页面加载 time.sleep(2) # 定位用户名和密码输入框,并输入值 username_input = driver.find_element(By.ID, "txtUser") password_input = driver.find_element(By.ID, "txtPass") username_input.send_keys("your_username") password_input.send_keys("your_password") # 定位登录按钮并点击 login_button = driver.find_element(By.ID, "btnLogin") login_button.click() # 等待登录完成 time.sleep(3) # 访问受保护的页面 driver.get("https://example.com/protected_page") # 获取页面内容 page_source = driver.page_source print(page_source) # 关闭浏览器 driver.quit() ``` #### 2. 获取Cookies用于后续请求 有时,你可能希望将 Selenium 获取的认证信息(如 Cookie)传递给 `requests` 库,以实现更高效的 HTTP 请求[^1]。你可以通过以下方式获取当前会话的 Cookie 并将其用于其他请求: ```python # 获取当前会话的所有Cookies cookies = driver.get_cookies() # 将Cookies转换为字典格式 cookie_dict = {cookie['name']: cookie['value'] for cookie in cookies} # 使用requests库发送带Cookie的GET请求 import requests response = requests.get("https://example.com/protected_page", cookies=cookie_dict) print(response.text) ``` #### 3. 处理动态生成的内容 某些网站采用 JavaScript 动态加载内容,此时直接读取页面源码可能无法获取完整的 HTML 内容。在这种情况下,可以等待特定元素出现后再提取页面内容,确保所有数据已经加载完毕。 ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待某个特定元素可见 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "target_element_id")) ) # 提取数据 data_element = driver.find_element(By.ID, "target_element_id") print(data_element.text) ``` #### 4. 避免被检测爬虫 为了防止被反爬机制识别,建议采取以下措施: - 设置合理的等待时间,避免频繁请求。 - 使用随机 User-Agent 和 IP 地址。 - 在脚本中加入随机行为,例如滚动页面、点击链接等。 #### 5. 注意事项 - **验证码问题**:如果登录页面包含验证码,Selenium 本身无法自动识别,需要人工干预或使用第三方 OCR 工具。 - **安全性**:不要将敏感凭据硬编码在脚本中,建议使用环境变量或配置文件。 - **法律与道德**:确保你的爬虫行为符合目标网站的服务条款,并尊重其 Robots 协议。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i阿极

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值