我正在抓取一个包含大小为 100MB 的大页面的网站。
驱动程序设置:
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("window-size=1920,1080")
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--ignore-certificate-errors')
driver = webdriver.Chrome(executable_path="chromedriver", chrome_options=chrome_options)
以下代码
html = driver.page_source
导致错误:
selenium WebDriverException: Message: unknown error: bad inspector message
(Session info: headless chrome=66.0.3359.181)
(Driver info: chromedriver=2.38.552518 (183d19265345f54ce39cbb94cf81ba5f15905011),platform=Mac OS X 10.11.6 x86_64)
我的笔记本电脑上不可能是"内存不足">
此错误消息...
selenium WebDriverException: Message: unknown error: bad inspector message
。暗示ChromeDriver在执行代码行时由于JSON编码/解码问题而无法解析某些非UTF-8字符:
html = driver.page_source
分析
参考John Chen(所有者 - Google Chrome 的 WebDriver(在讨论问题 1860 中的评论:"WebDriver异常:消息:未知错误:错误的检查器消息:",当尝试获取page_source可能用例中网站的页面源代码包含 Unicode 字符点FFFF
,这是一个无效字符。Chrome 在将其发送到 ChromeDrive 之前将其编码为uFFFF
,但 ChromeDriver 随后在解码时将其视为无效而拒绝。
John Chen(Google Chrome的WebDriver所有者(进一步补充说:
JSON 编码发生在 DevTools 的协议布局中,就在结果发送回 ChromeDrive 之前。相关代码为 https://cs.chromium.org/chromium/src/out/Debug/gen/v8/src/inspector/protocol/Protocol.cpp。特别是,escapeStringForJSON 函数负责编码字符串。这实际上是相当保守的。高于 126 的任何值都以 \uXXXX 格式编码。(请注意,Protocol.cpp 是一个生成的文件。真正的来源是 https://cs.chromium.org/chromium/src/v8/third_party/inspector_protocol/lib/Values_cpp.template。
该错误发生在 ChromeDriver 使用的 JSON 解析器中。\uXXXX 序列的解码发生在 https://cs.chromium.org/chromium/src/base/json/json_parser.cc?l=564 和 https://cs.chromium.org/chromium/src/base/json/json_parser.cc?l=670。解码转义序列后,解码器会拒绝任何不是有效 Unicode 字符的内容。
我注意到最近有一个更改,以防止 JSON 编码器发出无效的 Unicode 代码点:https://crrev.com/478900。不幸的是,它不是此错误中涉及的代码使用的 JSON 编码器,因此它不能直接帮助我们,但这表明我们不是唯一受此类问题影响的人。
溶液
此问题已得到解决,在chromedriver 中解码无效的 UTF 字符串时替换无效的 UTF-16 转义序列,因为 Web 平台测试可能会通过此修订/提交使用 ECMAScript 字符串,这些字符串不一定是 utf-16 字符。
因此,一个快速的解决方案是确保以下内容并重新执行测试:
- 硒已升级到当前级别 版本 3.141.59。
- ChromeDriver已更新到当前的 ChromeDriver v79.0.3945.36 级别。 Chrome
- 已更新到当前的Chrome 版本 79.0级别。(根据 ChromeDriver v79.0 发行说明(
另类
作为替代方案,您可以使用GeckoDriver/Firefox组合,您可以在Chromedriver中找到相关讨论,仅支持BMP错误中的字符,同时使用Selenium Python将带有ChromeDriver Chrome的表情符号发送到Tkinter的label((文本框