使用 Webkit 进行无头浏览

13
  • 使用基于 WebKit 的工具构建无头浏览器来爬取网页(我需要这个功能,因为我想评估页面上的 JavaScript 并获取最终呈现的页面)。但是,到目前为止,我实施的两个不同系统表现非常差。我已经实施了两个不同的系统,两者都使用 WebKit 作为后端:
  • 使用 Google Chrome:我会启动 Google Chrome 并使用由 Chrome 暴露的 WebSockets 进行通信,以进行远程调试(通过线路进行调试)。这样我就可以控制每个标签页,加载新页面,一旦页面加载完成,我就获取所加载网页的 DOM。
  • 使用 phantomjs:phantomjs 使用 WebKit 加载页面并提供无头浏览选项。正如 phantomjs 的示例所解释的那样,我使用 page.open 打开一个新的 URL,然后通过在页面上评估 JavaScript 来获取 DOM。
  • 我的目标是尽可能快地爬取页面,如果页面在第一次10秒内无法加载,则宣布失败并继续下一个页面。我知道每个页面需要一段时间才能加载,所以为了提高每秒钟加载的页面数,我在 Chrome 中打开许多标签页,或者使用 phantomjs 启动多个并行进程。以下是我观察到的性能:
  • 如果我在 Chrome 中打开超过20个标签 / 在20个 phantomjs 实例中启动,CPU 使用率会飙升。
  • 由于 CPU 使用率很高,许多页面需要超过10秒才能加载,因此我的失败率较高(约80%的页面加载请求失败)
  • 如果我希望将失败次数保持在总请求的不到5%以下,则每秒钟最多只能加载1个 URL。
  • 在尝试了这两个基于 WebKit 的系统之后,感觉性能瓶颈是 WebKit 渲染引擎,因此想要从其他用户那里了解我可以期望每秒爬取的 URL 数量。我的硬件配置为:
  • 处理器: Intel® Core™ i7-2635QM (1个处理器, 4个内核)
  • 显卡: AMD Radeon HD 6490M (256MB)
  • 内存: 4GB
  • 网络带宽足够好,能够加载超过我正在观察到的性能的页面
  • 我想问这个邮件列表的问题是,有没有人使用webkit来爬取一组随机的URL(比如从twitter流中选择10k个URL),我可以合理地期望每秒爬取多少个URL?

    谢谢


    1
    一个月左右我就能回答你的问题了 :) 我正在使用 Node.jsPhantomJS 做类似的事情(但我想评估其他东西)。同时,我会从你可能得到的答案中受益! - Pooria Azimi
    2个回答

    3
    这个问题实际上与软件不太相关,而是与硬件有关,但无论如何,让我指出一些更好的方向。首先,了解到每个页面本身都会产生多个线程。它将下载页面,然后开始为页面上的元素(例如javascript文件、css文件和图像)生成新的下载线程。[参考:http://blog.marcchung.com/2008/09/05/chromes-process-model-explained.html] 因此,根据页面的结构,您可能会同时启动相当数量的线程,加上您尝试同时执行过多的负载,就会出现问题。Stack Overflow线程 Optimal number of threads per core提供了更多关于你正在经历的情况的信息。您超载了CPU。
    你的处理器有4个物理核心和8个逻辑核心。我建议一次不要启动超过4个连接,留下次要的逻辑核心来处理一些线程。你可能会发现你甚至需要减少这个数字,但4是一个好的起点。通过一次渲染4个页面而不是过载整个系统尝试渲染20个页面,你实际上会增加你的整体速度,因为你最终会有更少的缓存交换。首先在几个易于计时的位置上记录你的时间。然后尝试使用更少或更多的连接。会有一个最佳点。请注意,PhantomJS的无头浏览器版本可能更适合你,因为在无头模式下它可能不会下载图片(这是一个优点)。
    你最好的选择是使用WebKit源码自己进行部分页面渲染http://www.webkit.org/。因为你似乎只需要渲染HTML和JavaScript,这样可以减少连接数量并使你能够更加有效地控制线程。在这种情况下,你可以创建一个事件队列,将所有主要的URL放入其中。启动4个工作线程,它们都从工作队列中获取任务,当它们处理一个页面并需要下载更多的资源时,它们可以将这些进一步的下载添加到队列中。一旦某个URL的页面的所有文件都已经下载到内存中(或者如果你担心内存问题,则可以下载到磁盘上),你可以向事件队列中添加一个项目来渲染该页面,并解析出所需的任何内容。

    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接