我想进行大规模的数据挖掘。为此,我需要一个快速爬虫。所有我需要的是下载一个网页,提取链接和递归跟随他们,但不访问相同的网址两次。基本上,我想避免循环。
我已经用python写了一个爬虫,但是太慢了。我不能用它来饱和100Mbit线。最高速度约为40个urls/秒。由于某些原因,很难得到更好的结果。这似乎是python的多线程/套接字的问题。我也遇到了python的gargabe收集器的问题,但这是可以解决的。顺便说一句,CPU不是瓶颈。
那么,我应该使用什么来编写一个尽可能快的爬虫,以及在爬行时避免循环的最佳解决方案是什么?
编辑:解决方案是组合multiprocessing
和threading
模块。产生多个进程,每个进程有多个线程,以获得最佳效果。在单个进程中派生多个线程是无效的,而且只有一个线程的多个进程会消耗太多内存。
发布于 2011-10-05 03:57:01
听起来你遇到的是设计问题而不是语言问题。尝试查看multiprocessing模块,以便同时访问更多站点,而不是线程。另外,考虑使用一些表来存储您以前访问过的站点(也许是一个数据库?)。
发布于 2011-10-05 04:02:58
为什么不使用已经测试过的爬行工具,比如Scrapy?我设法在RAM内存有限(大约400Mb)的低端VPS上达到了每秒100页,而网络速度约为6-7Mb/s(即低于100 Mb)。
您可以做的另一个改进是使用urllib3
(特别是在从单个域抓取多个页面时)。这是我前段时间做的一个简短的比较:
更新:
Scrapy现在是uses the Requests library,这又反过来uses urllib3。这使得Scrapy成为抓取的绝对首选工具。最近的版本也支持部署项目,因此从VPS中抓取比以往任何时候都更容易。
发布于 2012-07-18 18:57:57
大约2年前,我开发了一个爬虫。而且它每秒可以下载近250个And。你可以跟着我的脚步走。
a.下载器
b.链接提取器
c. URLSeen
d. ContentSeen
https://stackoverflow.com/questions/7653276
复制相似问题