8

我想做大规模的数据挖掘。为此,我需要一个快速的爬虫。我所需要的只是下载一个网页,提取链接并递归地跟踪它们,但无需访问相同的 url 两次。基本上,我想避免循环。

我已经用python写了一个爬虫,但是太慢了。我无法用它使 100Mbit 线路饱和。最高速度约为 40 个 URL/秒。由于某种原因,很难得到更好的结果。这似乎是 python 的多线程/套接字的问题。我也遇到了 python 的 gargabe 收集器的问题,但这是可以解决的。顺便说一句,CPU不是瓶颈。

那么,我应该用什么来编写一个尽可能快的爬虫,以及在爬取时避免循环的最佳解决方案是什么?

编辑:解决方案是组合multiprocessingthreading模块。生成多个进程,每个进程具有多个线程以获得最佳效果。在单个进程中生成多个线程是无效的,并且只有一个线程的多个进程会消耗太多内存。

4

5 回答 5

8

为什么不使用已经过爬行测试的东西,比如Scrapy?我设法在 RAM 内存有限(约 400Mb)的低端 VPS 上达到每秒近 100 页,而网络速度约为 6-7 Mb/s(即低于 100Mbps)。

您可以做的另一项改进是使用urllib3(尤其是在从单个域爬取多个页面时)。这是我前段时间做的一个简短的比较:

urllib 基准测试

更新:

Scrapy 现在使用 Requests 库,而后者又使用 urllib3。这使得 Scrapy 在抓取方面成为绝对的首选工具。最近的版本还支持部署项目,因此从 VPS 抓取比以往更容易。

于 2011-10-04T20:02:58.213 回答
3

大约 2 年前,我开发了一个爬虫。它每秒可以下载近 250 个网址。你可以顺着我的脚步。

  1. 优化您的文件指针使用。尝试使用最小的文件指针。
  2. 不要每次都写入数据。在存储大约 5000 个 url 或 10000 个 url 后尝试转储数据。
  3. 为了您的健壮性,您不需要使用不同的配置。尝试使用日志文件,当您想要恢复时,只需尝试读取日志文件并恢复您的爬虫。
  4. 分发您所有的网络爬虫任务。并以间隔明智地处理它。

    一种。下载器

    湾。链接提取器

    C。URLSeen

    d。内容可见

于 2012-07-18T10:57:56.793 回答
2

我写了一个简单的多线程爬虫。它在 GitHub 上作为发现 Web 资源提供,我写了一篇相关文章:自动发现博客订阅源和 Twitter、Facebook、LinkedIn 帐户连接到商业网站。您可以更改 NWORKERS 类变量中使用的线程数。如果您需要额外帮助,请随时提出任何进一步的问题。

于 2012-10-25T17:59:41.697 回答
1

听起来您的设计问题多于语言问题。尝试查看多处理模块以同时访问更多站点而不是线程。另外,考虑获取一些表来存储您以前访问过的站点(可能是数据库?)。

于 2011-10-04T19:57:01.383 回答
1

无法说出您的限制是什么。您的问题与C10K 问题类似——先阅读,不要立即优化。追求唾手可得的成果:通过分析应用程序设计,您很可能会获得显着的性能改进。不要从大规模多线程或大规模多处理开始。

我会使用Twisted来编写网络部分,这可能非常快。一般来说,机器上的 I/O 必须优于平均水平。您必须将数据写入磁盘或另一台机器,并非每个笔记本都支持 10MByte/s 的持续数据库写入。最后,如果你有一个异步互联网连接,那可能只是你的上游已经饱和了。ACK 优先级在这里有帮助(OpenBSD 示例)。

于 2011-10-04T19:59:34.877 回答