我在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)
答案 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本质上非常异步。