快速互联网爬虫

8 投票
5 回答
7630 浏览
提问于 2025-04-17 03:40

我想进行大规模的数据挖掘。为此,我需要一个快速的爬虫。我的需求很简单,就是下载一个网页,提取链接,然后递归地跟踪这些链接,但不想重复访问同一个网址。总之,我想避免循环。

我已经用Python写了一个爬虫,但速度太慢了。我无法充分利用100Mbit的网络带宽。最高速度大约是每秒40个网址,但不知道为什么很难再提高速度。看起来是Python的多线程和套接字出了问题。我还遇到了Python的垃圾回收器的问题,不过那个是可以解决的。顺便说一下,CPU并不是瓶颈。

那么,我应该用什么来写一个尽可能快的爬虫呢?还有,怎样才能在爬虫过程中避免循环访问呢?

补充说明:解决方案是结合使用multiprocessingthreading模块。每个进程中启动多个线程,这样效果最好。在单个进程中启动多个线程效果不佳,而多个进程每个只用一个线程又会消耗太多内存。

5 个回答

3

大约两年前,我开发了一个爬虫程序。这个程序可以每秒下载大约250个网址。你可以按照我的步骤来做。

  1. 优化你的文件指针使用。尽量减少文件指针的数量。
  2. 不要每次都写入数据。可以在存储了大约5000个或10000个网址后再进行一次性写入。
  3. 为了提高程序的稳定性,不需要使用不同的配置。可以使用一个日志文件,当你想要继续时,只需读取这个日志文件,恢复你的爬虫程序。
  4. 将你的爬虫任务分散处理,并按时间间隔进行处理。

    a. 下载器

    b. 链接提取器

    c. 已见网址

    d. 已见内容

8

为什么不使用一些已经经过测试的爬虫工具,比如Scrapy呢?我在一台内存有限(大约400Mb)的低配VPS上,竟然能达到每秒几乎100个页面的抓取速度,而网络速度大约是6-7 Mb/s(也就是低于100Mbps)。

你还可以做的一个改进是使用urllib3(特别是在从同一个网站抓取很多页面的时候)。我之前做过一个简单的比较:

urllib benchmark

更新:

现在Scrapy已经使用了Requests库,而Requests库又使用了urllib3。这使得Scrapy成为抓取数据时的最佳选择。最近的版本还支持项目的部署,所以从VPS上抓取数据比以前更简单了。

1

听起来你遇到的问题更多是设计上的,而不是语言上的。你可以看看 multiprocessing 这个模块,它可以让你同时访问更多的网站,而不是使用线程。另外,考虑用一些表格来存储你之前访问过的网站(也许可以用数据库?)。

撰写回答