使用webkit进行无头浏览

时间:2012-07-11 20:44:00

标签: webkit google-chrome-devtools phantomjs

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

  1. 使用谷歌浏览器:我会启动谷歌浏览器并使用Chrome公开的webSockets与每个标签进行通信,以进行远程调试(debugging over wire)。这样我就可以控制每个选项卡,加载一个新页面,一旦加载页面,我就会获取加载的网页的DOM。
  2. 使用phantomjs:phantomjs使用webkit加载页面并提供无头浏览选项。正如phantomjs的例子中所解释的那样,我使用page.open打开一个新的URL,然后通过评估页面上的javascript来加载页面后获取dom。
  3. 我的目标是尽可能快地抓取页面,如果页面在前10秒内没有加载,则声明它失败并继续前进。我知道每个页面都需要一段时间来加载,所以为了增加每秒加载的页面数量,我在Chrome中打开了很多标签,或者使用phantomjs启动多个并行进程。以下是我观察到的表现:

    1. 如果我在Chrome / 20 phantomjs实例中打开超过20个标签,则CPU使用量会增加。
    2. 由于CPU使用率很高,很多页面的加载时间超过10秒,因此我的故障率更高(约80%的页面加载请求失败)
    3. 如果我打算将失败保持在少于总请求的5%,我每秒不能加载超过1个URL。
    4. 在尝试了两个基于webkit的系统之后,感觉性能瓶颈就是webkit渲染引擎,因此我想在这里了解其他用户,我可以期望每秒抓取的URL数量。我的硬件配置是:

      1. 处理器:Intel®Core™i7-2635QM(1个处理器,4个内核)
      2. 显卡:AMD Radeon HD 6490M(256MB)
      3. 内存:4GB
      4. 网络带宽非常适合加载页面而不是我观察的性能
      5. 我试图询问这个邮件列表的问题是,是否有任何人使用webkit抓取网页的随机URL集(比如从Twitter流中挑选10k个URL),我可以合理地期望有多少个URL每秒爬行?

        由于

2 个答案:

答案 0 :(得分:3)

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

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

因此,根据页面结构的方式,最终可能会有相同数量的线程同时出现在页面上,添加最多尝试一次执行太多加载并且您遇到问题。

Optimal number of threads per core处的Stack Overflow线程提供了有关您遇到的情况的更多信息。你的CPU过载了。

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

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

答案 1 :(得分:0)

取决于您要解析的数据,如果您只关心javascript和html,那么超文本查询语法会提供极大的加速,http://htql.net/,或者您可以在云中设置某些内容例如http://watirmelon.com/2011/08/29/running-your-watir-webdriver-tests-in-the-cloud-for-free/