webkit - 使用 webkit 进行 headless 浏览

标签 webkit google-chrome-devtools phantomjs

我正在使用基于 webkit 的工具来构建一个用于抓取网页的 headless 浏览器(我需要这个,因为我想评估在页面上找到的 javascript 并获取最终呈现的页面)。但是,到目前为止我实现的两个不同的系统表现出非常差的性能。我已经实现了两个不同的系统,它们都使用 webkit 作为后端:

  • 使用 Google Chrome:我将启动 Google Chrome 并使用 Chrome 公开的 webSockets 与每个选项卡进行通信,以进行远程调试 ( debugging over wire )。通过这种方式,我可以控制每个选项卡,加载一个新页面,加载页面后,我会获取已加载网页的 DOM。
  • 使用 phantomjs : phantomjs 使用 webkit 加载页面并提供 headless 浏览选项。如 phantomjs 示例中所述,我使用 page.open 打开一个新 URL,然后在页面加载后通过评估页面上的 javascript 来获取 dom。

  • 我的目标是尽可能快地抓取页面,如果页面在前 10 秒内没有加载,则声明它失败并继续。我知道每个页面都需要一段时间才能加载,因此为了增加每秒加载的页面数量,我在 Chrome 中打开了许多选项卡或使用 phantomjs 启动多个并行进程。以下是我观察到的性能:
  • 如果我在 Chrome/20 phantomjs 实例中打开超过 20 个选项卡,CPU 使用率会飙升。
  • 由于 CPU 使用率高,很多页面加载时间超过 10 秒,因此我有更高的失败率(约 80% 的页面加载请求失败)
  • 如果我打算将失败次数保持在总请求数的 5% 以下,则每秒加载的 URL 不能超过 1 个。

  • 在尝试了这两个基于 webkit 的系统后,感觉性能瓶颈是 webkit 渲染引擎,因此想从这里的其他用户那里了解我每秒可以抓取的 URL 数量。我的硬件配置是:
  • 处理器:英特尔® 酷睿™ i7-2635QM(1 个处理器,4 个内核)
  • 显卡:AMD Radeon HD 6490M (256MB)
  • 内存:4GB
  • 网络带宽足以加载比我观察到的性能更高的页面

  • 我想问这个邮件列表的问题是,有没有人有使用 webkit 为一组随机 URL 抓取网页的经验(比如从 twitter 流中选择 10k 个 URL),我可以合理地期望每秒抓取多少个 URL ?

    谢谢

    最佳答案

    这个问题实际上更多地与硬件相关而不是软件,但无论如何让我为您指出一些更好的方向。

    首先,了解每个页面本身都会产生多个线程。它将下载页面,然后开始为页面上的元素(例如 javascript 文件、css 文件和图像)生成新的下载线程。 [引用:http://blog.marcchung.com/2008/09/05/chromes-process-model-explained.html ]

    因此,根据页面的结构方式,您可能最终会在同一时间为该页面创建相当数量的线程,再加上您尝试一次执行太多加载,您就会遇到问题。

    堆栈溢出线程在 Optimal number of threads per core提供有关您正在经历的情况的更多信息。你的 CPU 重载。

    您的处理器是 4 个物理 8 个逻辑内核。我建议一次生成不超过 4 个连接,让辅助逻辑核心处理那里的一些线程。您可能会发现您甚至需要减少这个数字,但 4 是一个很好的起点。通过一次渲染 4 个页面而不是让整个系统重载尝试渲染 20 个页面,您实际上会提高整体速度,因为最终的缓存交换要少得多。首先根据几个容易计时的位置计时。然后尝试越来越少。会有一个甜蜜点。请注意,PhantomJS 的 headless 浏览器版本可能更适合您,因为在 headless 模式下它可能不会下载图像(加分项)。

    不过,您最好的整体选择是使用 http://www.webkit.org/ 上的 webkit 源代码自行渲染部分页面。 .因为看起来你需要渲染的只是 html 和 javascript。这减少了您的连接数量,并允许您以更高的效率控制您的线程。在这种情况下,您可以创建一个事件队列,将所有主 url 放入其中。产生 4 个工作线程,它们都在工作队列中工作,当它们处理页面并需要下载更多源时,他们可以将这些进一步的下载添加到队列中。将页面的所有文件下载到特定 url 的内存(或磁盘,如果您担心 ram)中后,您就可以将项目添加到事件队列中以呈现页面,然后根据需要对其进行解析。

    关于webkit - 使用 webkit 进行 headless 浏览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11441192/

    相关文章:

    javascript - 谷歌浏览器 : Override geolocation via console

    javascript - CasperJs 在嵌套循环中单击链接

    html - CSS 过渡 : Strange unwanted delay in Webkit browsers (Chrome and Safari)

    javascript - 是否可以查看打印在控制台上的两个 Javascript 对象是否是同一个实例(最好在 Chrome 中)

    swift - 如何以编程方式呈现 WKWebView 的 WebKit 检查器?

    google-chrome-devtools - Google Chrome 开发工具检查元素样式未显示

    python - 在 python 中使用 Selenium、PhantomJS 和 Tor

    c# - 如何在 phantomjsdriver selenium c# 中启用 cookie?

    html - JavaScript 中的 CSS webkit-image-mask 替代方案?

    javascript - Safari 在另一个过渡中应用 translate3d 过渡时隐藏元素