Selenium调用driver.get()访问特定网页报未知命令响应错误
问题描述
开展网页数据爬取工作时,访问目标网页提取数据过程中出现异常。将该链接与其他多个待抓取链接放入for循环批量处理时,其余链接均可正常访问,唯独调用driver.get()方法访问该链接时抛出异常。
相关实现代码
driver = webdriver.Chrome(executable_path="..\Drivers\chromedriver.exe") def page_content_extractor(given_line): print('in page content extractor function. Given link is : ',given_line) try: driver.get(given_line) except Exception as e: print('Exception occurred !! Find these links under rogue links') print(e) time.sleep(2)
异常栈信息
selenium.common.exceptions.WebDriverException: Message: unknown error: unexpected command response (Session info: chrome=103.0.5060.66) Stacktrace: Backtrace: Ordinal0 [0x006FD953+2414931] Ordinal0 [0x0068F5E1+1963489] Ordinal0 [0x0057C6B8+837304] Ordinal0 [0x0056EB34+781108] Ordinal0 [0x0056E06A+778346] Ordinal0 [0x0056D646+775750] Ordinal0 [0x0056CEBC+773820] Ordinal0 [0x0056CD59+773465] Ordinal0 [0x0057DA70+842352] Ordinal0 [0x005CAB6F+1157999] Ordinal0 [0x005C4463+1131619] Ordinal0 [0x0059E860+976992] Ordinal0 [0x0059F756+980822] GetHandleVerifier [0x0096CC62+2510274] GetHandleVerifier [0x0095F760+2455744] GetHandleVerifier [0x0078EABA+551962] GetHandleVerifier [0x0078D916+547446] Ordinal0 [0x00695F3B+1990459] Ordinal0 [0x0069A898+2009240] Ordinal0 [0x0069A985+2009477] Ordinal0 [0x006A3AD1+2046673] BaseThreadInitThunk [0x7660FA29+25] RtlGetAppContainerNamedObjectPath [0x77B07A9E+286] RtlGetAppContainerNamedObjectPath [0x77B07A6E+238] Process finished with exit code 1
补充说明
- 该异常仅在访问上述特定URL时触发,其余待爬链接访问均无异常
- 已尝试添加try-except块捕获异常但未生效
- 目前无法定位问题原因,求助可行的排查与修复方案
问题原因与修复方案
这个报错是Chrome 103版本和对应Selenium驱动的已知兼容问题,不是目标网站反爬导致,也不是代码逻辑问题。
核心原因
Chrome 103版本调整了页面加载过程中的CDP响应逻辑,当页面存在异步资源持续加载、提前推送响应帧的场景时,Seleniumdriver.get()默认等待页面完全加载的逻辑会收到非预期的命令响应,直接抛出unexpected command response异常。本次触发问题的目标页面前端有大量异步加载的轮播、3D轮毂渲染资源,刚好命中了这个兼容bug。
可行修复方案
按优先级从高到低尝试:
- 升级Selenium与ChromeDriver版本
直接把Selenium升级到4.3.0及以上版本,同时将Chrome浏览器和ChromeDriver升级到匹配的最新稳定版,这个兼容bug在Selenium 4.3.0版本已经做了官方修复,升级后不需要修改原有代码即可正常访问。
升级命令:pip install --upgrade selenium - 临时修改页面加载策略(无法升级版本时使用)
如果暂时不能升级环境,可以把Chrome的页面加载策略从默认的normal(等待所有资源加载完成)改成eager,只要DOM加载完成就返回,不会等待图片、渲染脚本这类慢资源加载,绕开响应冲突问题。修改初始化驱动的代码:from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.page_load_strategy = 'eager' driver = webdriver.Chrome(executable_path="..\Drivers\chromedriver.exe", options=chrome_options) - 异常重试兜底
之前写的try-except没生效是因为异常抛出后没有做重试逻辑,可以在捕获异常后增加重试机制,遇到这个报错时等待1秒后重新发起访问,大部分场景下第二次访问就能正常加载:import time def page_content_extractor(given_line, max_retry=2): print('in page content extractor function. Given link is : ',given_line) for i in range(max_retry): try: driver.get(given_line) break except Exception as e: print(f'第{i+1}次访问异常,准备重试' if i < max_retry-1 else '重试次数耗尽,标记为异常链接') print(e) time.sleep(1) time.sleep(2)
注意:不要使用
none加载策略,否则会出现DOM还没加载完就执行后续提取逻辑,导致元素定位失败。
内容的提问来源于stack exchange,提问作者Pratik Gokhale
相关产品推荐
相关产品推荐

