我正在使用基于 webkit 的工具来构建一个用于抓取网页的 headless 浏览器(我需要这个,因为我想评估在页面上找到的 javascript 并获取最终呈现的页面)。但是,到目前为止我实现的两个不同的系统表现出非常差的性能。我已经实现了两个不同的系统,它们都使用 webkit 作为后端:
我的目标是尽可能快地抓取页面,如果页面在前 10 秒内没有加载,则声明它失败并继续。我知道每个页面都需要一段时间才能加载,因此为了增加每秒加载的页面数量,我在 Chrome 中打开了许多选项卡或使用 phantomjs 启动多个并行进程。以下是我观察到的性能:
在尝试了这两个基于 webkit 的系统后,感觉性能瓶颈是 webkit 渲染引擎,因此想从这里的其他用户那里了解我每秒可以抓取的 URL 数量。我的硬件配置是:
我想问这个邮件列表的问题是,有没有人有使用 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/