13

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

  1. 使用 Google Chrome:我将启动 Google Chrome 并使用 Chrome 公开的 webSockets 与每个选项卡进行通信以进行远程调试(通过有线调试)。这样我可以控制每个选项卡,加载一个新页面,一旦页面加载,我就可以获取加载网页的 DOM。
  2. 使用phantomjs:phantomjs 使用 webkit 加载页面并提供无头浏览选项。正如 phantomjs 示例中所解释的,我使用 page.open 打开一个新 URL,然后在页面加载后通过评估页面上的 javascript 来获取 dom。

我的目标是尽可能快地抓取页面,如果页面在前 10 秒内没有加载,则声明它失败并继续前进。我知道每个页面都需要一段时间才能加载,因此为了增加每秒加载的页面数,我在 Chrome 中打开了许多选项卡或使用 phantomjs 启动多个并行进程。以下是我观察到的表现:

  1. 如果我在 Chrome / 20 个 phantomjs 实例中打开超过 20 个选项卡,CPU 使用率就会飙升。
  2. 由于 CPU 使用率很高,很多页面的加载时间超过 10 秒,因此我的失败率更高(大约 80% 的页面加载请求失败)
  3. 如果我打算将失败保持在总请求数的 5% 以下,我每秒加载的 URL 不能超过 1 个。

在尝试了这两个基于 webkit 的系统之后,感觉性能瓶颈是 webkit 渲染引擎,因此想从这里的其他用户那里了解我每秒可以抓取的 URL 数量。我的硬件配置是:

  1. 处理器:Intel® Core™ i7-2635QM(1 个处理器,4 个内核)
  2. 显卡:AMD Radeon HD 6490M (256MB)
  3. 内存:4GB
  4. 网络带宽足以加载页面超过我观察到的性能

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

谢谢

4

2 回答 2

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,您就可以将一个项目添加到事件队列中以呈现页面,然后根据需要对其进行解析。

于 2012-07-30T18:01:11.267 回答
0

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

于 2012-07-31T04:40:10.237 回答