python - selenium WebDriverException:消息:未知错误:使用 Selenium Python 使用 ChromeDriver Chrome 提取页面源时出现错误检查器消息
问题描述
我正在抓取一个包含 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 中的评论:“WebDriverException:消息:未知错误:错误的检查器消息:”在尝试获取 page_source 时可能是您的用例中网站的页面源FFFF
包含无效字符的Unicode 字符点。Chrome\uFFFF
在将其发送到 ChromeDriver 之前对其进行编码,但 ChromeDriver 然后在解码时将其拒绝为无效。
John Chen(所有者 - Google Chrome 的 WebDriver)进一步补充说:
JSON 编码发生在 DevTools 的协议布局中,就在结果被发送回 ChromeDriver 之前。相关代码在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 字符。
因此,一个快速的解决方案是确保以下内容并重新执行您的测试:
- Selenium升级到当前级别版本 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() 文本框
推荐阅读
- postgresql - 首先尝试更新的 INSERT ... ON CONFLICT 相当于什么?
- prism - Fluent.Ribbon 的 RegionAdapter
- python - 如何修复部署在 AWS EC2 中但 CSS 和照片不起作用的 Django 项目
- python - PyTorch 数据集:ImageFolder 和子文件夹过滤
- javascript - 为什么值为空?
- javascript - 如何让 MongoDB 将数字识别为双精度数?
- python - 将数据框附加到具有不同列数的 excel 文件
- python-3.x - 如何在 Python 中使用 xmlrpc 将内容发布到静态 wordpress 页面?
- jquery - 验证表单 - 如果字段为空,则为每个空的字段添加类,然后不提交。坚持组合成一个功能
- java - 实现RouterLayout的类也可以定义为@Route吗