在通过 Selenium 和 Python 进行第一页查询时,ChromeDriver 比 GeckoDriver 慢太多

ChromeDriver is too slower than GeckoDriver on the first page query through Selenium and Python

我有最新版本的驱动程序 (chromedriver=2.44.609551)、selenium 包 (3.141.0) 和 (headless chrome=70.0.3538.110)。 (在 windows)

我正在用浏览器打开多个 windows。 使用 firefox,我的脚本总是很快。但是在 chrome 上,切换到 window 后(页面已经加载),当我尝试从浏览器获取任何内容时(比如 driver.page_source 或任何 find_element),我有 4 秒左右的延迟。

我是不是做错了什么?

[driver.execute_script('window.open(arguments[0]);', url) for url in urls]
for window in driver.window_handles[1:]:
    driver.switch_to.window(window)
    driver.page_source                                #it takes 4s here
    driver.find_elements_by_class_name('class_name')  #regular speed here (fast)
    break

如果我将 driver.page_source 切换为 driver.find_elements_by_class_name('class_name'),第一个总是很慢。

正如您在问题中提到的 GeckoDriver / Firefox 组合比 ChromeDriver / Chrome 在这一点上值得一提的是,不同的浏览器以不同的方式呈现 HTML DOM

您可以在

中找到详细的讨论

此外,关于不可预测的 CPU内存消耗 的讨论很多40=]Chrome 无头 会话。

根据讨论 Building headless for minimum cpu+mem usage,CPU + 内存使用可以通过以下方式优化:

  • 使用自定义代理或 C++ ProtocolHandlers,您可以 return 存根 1x1 像素图像,甚至完全阻止它们。
  • Chromium 团队正在努力在生成帧时添加 programmatic control。目前 headless chrome 仍在尝试以 60 fps 渲染,这是相当浪费的。许多页面确实需要几帧(可能 10-20 fps)才能正确呈现(由于使用了 requestAnimationFrameanimation triggers),但我们希望有在这里可以节省很多 CPU。
  • MemoryInfra 应该可以帮助您确定哪个组件是您设置中内存消耗最大的组件。
  • 用法可以是:

    $ headless_shell --remote-debugging-port=9222 --trace-startup=*,disabled-by-default-memory-infra http://www.chromium.org
    
  • Chromium 总是会使用尽可能多的可用资源。如果你想有效地限制它的使用,你应该考虑使用 cgroups

您可以在

中找到详细的讨论