使用Eventlet和Python获取网页的速度?

3
我正在使用Python编写一个相对简单的网络爬虫,但是我想使用异步网络库以便同时获取多个页面。我看到了他们网站上的示例,但当我应用相同的逻辑时,对于~1000/2000个URL和~200个网页,性能会变慢。(大部分URL来自不同的域,并且我已经将它们混合了)。 使用Eventlet爬取这么多页面的最快方法是什么,我可以得到什么样的速度?(类似于每秒抓取次数)。
以下是示例:

urls = ["http://www.google.com/intl/en_ALL/images/logo.gif",
     "https://wiki.secondlife.com/w/images/secondlife.jpg",
     "http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif"]

import eventlet
from eventlet.green import urllib2

def fetch(url):

  return urllib2.urlopen(url).read()

pool = eventlet.GreenPool()

for body in pool.imap(fetch, urls):
  print "got body", len(body)

欢迎提出关于Twisted的想法。 - Charles Ellis
Scrapy不够高效吗? - Acorn
也许,但我想自己创建爬虫,并计划爬取更多的网站。我首先想让它快速处理数千个网站。 - Charles Ellis
1个回答

2
我们使用Spawning web服务器创建了一个转换代理服务。Spawning在内部使用eventlets。该服务的目的是向移动应用程序(iPhone、Android等)公开传统的XML API。

http://pypi.python.org/pypi/Spawning/

1)服务器调用ISS支持的后端服务,使用urllib输出XML。
2)Python读取XML并将其转换为JSON。解析时使用了lxml,输出时使用了带有本地C扩展的simplejson。
3)生成的JSON被发送到客户端。
使用eventlets时性能非常出色,在具有8个虚拟核心的服务器上可以达到每秒超过1000个请求。性能稳定(零错误%)。没有延迟。我们需要在进程数和每个进程的线程数之间进行一些平衡,我认为我们使用了类似于每个进程20-50个线程的12个进程。
我们还测试了Twisted及其异步页面获取方法。对于Twisted,在开始看到太多错误之前,我们只能获得200个请求/秒的性能。使用Twisted时,延迟也很快开始增加,并使这种方法失败。
性能是使用复杂的JMeter脚本进行测量的,该脚本执行所有花哨的操作,如身份验证等。
我认为关键在于Spawning如何对urllib进行猴子补丁,使其本质上非常异步。

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