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

时间:2011-04-20 17:10:07

标签: python asynchronous web-crawler eventlet

我在Python中编写了一个相对简单的爬虫,但是我想使用异步网络lib来同时获取多个页面。我在他们的页面上看到了这些例子,但是当我应用所显示的相同逻辑时,它适用于大约200个网页~1000 / 2000网址,  性能下降。(大多数网址来自不同的域名,我已经洗牌了)。 使用Eventlet抓取这么多页面的最快方法是什么?我可以获得什么样的速度? (像抓取的速度/ s)

以下是示例:


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)

1 个答案:

答案 0 :(得分:2)

我们使用Spawning Web服务器创建了转换代理服务。产卵在内部使用eventlets。服务的目的是将旧版XML API暴露给移动应用程序(iPhone,Android等)

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

1)服务器调用ISS支持的后端服务,该服务使用urllib输出XML

2)Python读取XML,将其转换为JSON。 lxml用于解析,simplejson用本地C扩展编译为输出

3)生成的JSON被发送到客户端

使用eventlet的表现很棒>具有8个虚拟核心的服务器上的1000 req / s。性能稳定(零误差%s)。没有延迟。我们必须在每个进程的进程数和线程数之间做一些平衡,我认为我们使用了12个进程,每个进程有20-50个线程。

我们还测试了Twisted及其异步页面get方法。对于Twisted,在我们开始看到太多错误之前,我们设法只获得了200 req / s的性能。随着Twisted,延迟也开始快速增长并注定了这种方法。

使用复杂的JMeter脚本测量性能,这些脚本执行了诸如身份验证等所有时髦的东西。

我认为这里的关键是如何产生猴子补丁urllib本质上非常异步。