3

我正在用 Python 编写一个相对简单的爬虫,但我想使用异步网络库来同时获取多个页面。我在他们的页面上看到了示例,但是当我应用显示的相同逻辑并适用于约 200 个网页时~1000/2000 url,性能下降。(大多数 url 来自不同的域,我已经将它们洗牌)。用 Eventlet 抓取这么多页面的最快方法是什么?我能得到什么速度?(速度如 fetches/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)
4

1 回答 1

2

我们使用 Spawning Web 服务器创建了一个转换代理服务。Spawning 在内部使用 eventlet。服务的目的是将遗留的 XML API 暴露给移动应用程序(iPhone、Android 等)

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

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

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

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

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

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

性能是用复杂的 JMeter 脚本来衡量的,这些脚本完成了所有时髦的事情,比如身份验证等。

我认为这里的关键是 Spawning monkey-patches urllib 本质上是非常异步的。

于 2011-04-20T18:41:41.910 回答