如何解决Selenium打开网页后出现的加载错误?

新手上路,请多包涵

9ac75485342102858d1cf6c53ec39a04_auto-orient,1.png
c106e5d609511bf02cb8ef440d24da5f_auto-orient,1.png

1、selenium链接已打开的网页(若通过webdriver打开该URL,会直接出现上述错误),该页面的静态数据可正常取值;

2、运行程序结束后,打开相关字段的弹窗类动态趋势图加载失败;

3、按F5刷新整个页面亦会报上图类似错误;

4、只能关闭浏览器过一会,再次打开该页面,数据才可正常显示;

5、更换多台电脑亦会出现上述问题,在家中测试亦然(仅可正常刷新数据,爬取数据后,手动点击页面链接提示上图加载失败)。
6、使用edge、Firefox都会出现同样的问题

我的webdriver配置如下:
option = webdriver.ChromeOptions()
option.add_experimental_option("excludeSwitches", ['enable-automation'])
option.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
option.add_argument("--disable-blink-features=AutomationControlled")
option.add_experimental_option("useAutomationExtension", False)
option.add_experimental_option("detach", True)
driver=webdriver.Chrome(options=option)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",
})

阅读 211
avatarAI BotBETA

可能原因及解决方案:

1. 动态内容等待策略(核心问题)

# 显式等待动态元素加载(推荐使用WebDriverWait)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 在关键操作后添加等待(示例)
try:
    element = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.CLASS_NAME, "趋势图容器类名"))
    )
except:
    print("动态内容加载超时")

2. 增强反检测配置

options = webdriver.ChromeOptions()
# 添加以下新参数
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--remote-debugging-port=9222")

# 禁用自动化特征(增强版)
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation", "enable-logging"])
options.add_experimental_option("useAutomationExtension", False)

# 添加更多反指纹参数
options.add_argument("--disable-webgl")
options.add_argument("--disable-canvas-aa")

3. 请求头强化

# 通过CDP设置完整请求头
headers = {
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://example.com",
    "DNT": "1"
}

driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": headers})

4. 会话隔离策略

# 每次操作后清除状态
driver.delete_all_cookies()
driver.execute_script("window.localStorage.clear();")
driver.execute_script("window.sessionStorage.clear();")

调试建议:

  1. 使用Chrome DevTools Protocol监控网络请求:

    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    
    caps = DesiredCapabilities.CHROME
    caps['goog:loggingPrefs'] = {'performance': 'ALL'}
    driver = webdriver.Chrome(desired_capabilities=caps)
    
    # 获取网络日志
    for entry in driver.get_log('performance'):
     print(entry)
  2. 尝试使用无头模式测试:

    options.add_argument("--headless=new")  # Chrome 112+新无头模式
  3. 使用代理轮换(示例):

    options.add_argument("--proxy-server=http://user:pass@ip:port")

备选方案

如果上述方法无效,可尝试使用更底层的自动化工具:

# 使用undetected-chromedriver(需安装)
import undetected_chromedriver as uc

driver = uc.Chrome(headless=False)
driver.get('目标URL')
注意:如果网站使用Cloudflare防护,可能需要添加鼠标移动轨迹模拟和更复杂的指纹混淆策略。建议通过浏览器手动操作确认是否是反爬机制触发的错误。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏