【完整代码】Python代码,实现selenium页面元素找不到超时时,刷新驱动和刷新页面,若能找到,继续执行下一步

需求:

Python代码,使用Selenium进行网页自动化操作,页面元素找不到超时时,每隔5秒钟刷新一次页,在这5秒内再找元素,如果刷新了页面5次后还找不到,重启驱动后,继续每隔5秒钟刷新一次页,在这5秒内再找元素,如果刷新了页面5次后还找不到,重启驱动后,继续,就这样大循环三次后还找不到,退出驱动。

完整代码

1. 安装必要的库

确保你已经安装了Selenium和webdriver_manager

pip install selenium webdriver_manager

2. 完整代码示例

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time

def get_webdriver():
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')  # 无头模式
    options.add_argument('--disable-gpu')
    options.add_argument('--no-sandbox')
    return webdriver.Chrome(ChromeDriverManager().install(), options=options)

def retry_with_refresh_and_restart(func):
    def wrapper(*args, **kwargs):
        max_refresh_retries = 5
        max_driver_restarts = 3
        delay = 5
        driver = args[0]

        for restart_attempt in range(max_driver_restarts):
            for refresh_attempt in range(max_refresh_retries):
                try:
                    return func(*args, **kwargs)
                except (NoSuchElementException, TimeoutException) as e:
                    print(f"Exception: {e}. Refresh attempt {refresh_attempt + 1} of {max_refresh_retries}.")
                    driver.refresh()
                    time.sleep(delay)
            print("Max refresh attempts reached. Restarting driver...")
            driver.quit()
            driver = get_webdriver()
            args = (driver,) + args[1:]  # 更新driver参数
        raise Exception(f"Failed to complete the operation after {max_driver_restarts} driver restarts and {max_refresh_retries} refresh attempts each.")
    return wrapper

@retry_with_refresh_and_restart
def login(driver, url, username, password):
    driver.get(url)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, 'username')))

    username_field = driver.find_element(By.NAME, 'username')
    username_field.send_keys(username)

    password_field = driver.find_element(By.NAME, 'password')
    password_field.send_keys(password)

    login_button = driver.find_element(By.NAME, 'login')
    login_button.click()

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'logout')))
    print("Logged in successfully!")

if __name__ == "__main__":
    url = 'http://example.com/login'
    username = 'your_username'
    password = 'your_password'

    driver = get_webdriver()
    try:
        login(driver, url, username, password)
    except Exception as e:
        print(f"Failed to login: {e}")
    finally:
        driver.quit()

关键点说明

  1. 获取浏览器驱动get_webdriver函数设置了浏览器选项并返回一个Chrome驱动实例。
  2. 重试和刷新机制retry_with_refresh_and_restart装饰器在捕获到NoSuchElementExceptionTimeoutException时,每隔5秒刷新一次页面,最多刷新5次。如果仍然找不到元素,则重启驱动并继续尝试。这个过程最多会重复3次。
  3. 登录函数login函数执行实际的登录操作,包括打开URL、输入用户名和密码、点击登录按钮,并等待登录成功的元素出现。

通过这种方式,程序在遇到页面元素找不到的情况时,会刷新页面并重新尝试操作,如果达到最大重试次数,还会重启驱动并继续尝试,从而提高操作的成功率。

<think>好的,我现在需要帮助用户解决如何用Selenium或DrissionPage绕过京东的反爬虫检测,实现正常页面加载的问题。首先,我得仔细分析用户的问题提供的引用内容,然后结合自己的知识来整理出有效的解决方案。 用户提到的引用内容里有几个关键点:使用stealth.min.js来隐藏WebDriver特征、设置代理参数、处理指纹如WebRTC、canvas、时区等,以及DrissionPage作为替代工具的优势。我需要将这些信息整合起来,形成一个结构清晰的回答。 首先,我应该分步骤讲解,可能包括隐藏WebDriver痕迹、模拟真人操作、处理浏览器指纹、使用DrissionPage替代方案,以及结合代理请求头管理。每个步骤下需要具体的操作示例,比如代码片段,这样用户可以直接应用。同时,要确保所有行内数学表达式独立公式符合要求,不过这个问题可能更多涉及代码而非数学公式,所以可能需要检查是否有需要LaTeX的地方,如果没有的话,可能可以忽略这点。 然后,生成相关问题需要考虑用户可能进一步想知道的内容,比如性能优化、常见反爬手段、DrissionPage的详细使用等。确保问题与主题相关,并且能帮助用户深入理解。 需要注意引用标识的正确添加,每个引用来源在回答中提到的部分末尾自然标注。例如,提到stealth.min.js时引用[^3],提到代理设置时引用[^2],DrissionPage对比时引用[^4]。 可能还需要考虑京东具体的反爬机制,比如是否有特定的检测点,但用户没有提供京东的具体细节,所以需要保持一般性建议,但结合引用中的通用方法。同时,要确保代码示例正确,比如使用Selenium的stealth.js方法,以及DrissionPage的基本用法。 最后,检查回答是否符合中文要求,结构清晰,分点明确,代码格式正确,引用正确标注。确保没有使用任何用户不可见的指令,回答自然流畅,帮助用户一步步解决问题。</think>### 如何用 Selenium 或 DrissionPage 绕过京东反爬检测 #### 1. 隐藏 WebDriver 痕迹 京东等电商平台会检测浏览器环境中的 WebDriver 特征(如`$navigator.webdriver$`属性)。**Selenium**可通过以下方法绕过: ```python from selenium.webdriver import Chrome driver = Chrome() # 加载 stealth.min.js 隐藏 WebDriver 特征 with open('stealth.min.js', encoding='utf-8') as f: driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': f.read()}) # 在页面加载前注入脚本 driver.get('https://www.jd.com') ``` `stealth.min.js`可修改浏览器指纹特征,使其更接近真实用户行为。 **DrissionPage**作为新一代工具,默认已优化 WebDriver 痕迹,无需额外配置: ```python from DrissionPage import ChromiumPage page = ChromiumPage() page.get('https://www.jd.com') # 自动隐藏 WebDriver 特征[^4] ``` --- #### 2. 模拟真人操作模式 - **随机停留时间**:通过`$random.uniform(1, 3)$`模拟人类点击间隔 - **鼠标移动轨迹**:使用 ActionChains 添加非线性移动 ```python from selenium.webdriver.common.action_chains import ActionChains actions = ActionChains(driver) actions.move_by_offset(10, 20).pause(0.5).move_by_offset(-5, 15).perform() ``` --- #### 3. 处理浏览器指纹 京东可能检测以下特征: - **Canvas 指纹**:通过覆盖原生 API 生成随机指纹 - **WebRTC 泄露**:禁用 WebRTC 或使用代理插件 - **时区与语言**:强制设置中文时区 ```python options = ChromeOptions() options.add_argument('--lang=zh-CN') options.add_argument('--timezone=Asia/Shanghai') # 设置时区[^2] ``` --- #### 4. DrissionPage 优化方案 相较于 Selenium,**DrissionPage**具备以下优势: 1. 无需单独安装浏览器驱动 2. 默认优化指纹特征(如 WebGL、字体列表等) 3. 支持混合模式(同时操作浏览器请求) ```python page = ChromiumPage() page.get('https://item.jd.com/100038348832.html') # 直接访问商品页 print(page.ele('tag:h2').text) # 智能定位元素 ``` --- #### 5. 代理与请求头管理 必须配合代理 IP Header 随机化: ```python # Selenium 代理设置(需同时设置 capabilities) options.add_argument('--proxy-server=http://127.0.0.1:8080') driver = Chrome(options=options) # DrissionPage 代理设置 page.set.proxy('http://127.0.0.1:8080') # 简化的代理配置 ``` 注意需定期更换 User-Agent,推荐使用`$fake_useragent`库生成随机头部[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今晚务必早点睡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值