并发下载 - Python

9
计划如下:
我会下载一个网页,在DOM中解析图像列表,然后下载这些图像。之后,我将遍历这些图像,以确定哪个图像最适合代表该网页。
问题在于图像是逐个下载的,这可能需要相当长的时间。
如果有人能够指导我关于这个主题的方向,那将非常好。
非常感谢您的帮助。
4个回答

13

加速网络爬虫基本上是Eventlet的主要用途。它非常快-我们有一个应用程序需要在几分钟内访问2,000,000个URL。它利用您系统上最快的事件接口(通常是epoll),并使用绿色线程(建立在协程之上,非常廉价)使编写变得容易。

这里是文档中的示例

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):
  body = urllib2.urlopen(url).read()
  return url, body

pool = eventlet.GreenPool()
for url, body in pool.imap(fetch, urls):
  print "got body from", url, "of length", len(body)

这是开发更完整的爬虫的非常不错的起点。欢迎随时进入Freenode上的 #eventlet 寻求帮助。

[更新:我在文档中添加了一个更复杂的递归网络爬虫示例。我保证在提出这个问题之前就已经在进行中了,但这个问题最终确实激励我完成了它。 :)]


6

虽然使用线程确实是一种可能,但我建议使用asyncore,这里有一个非常棒的例子(点击此处),可以展示同时获取两个URL的情况(易于推广到任何URL列表!)。


4

这里是一篇关于线程的文章,以url获取为例。


0

现在有一些非常优秀的Python库,你可能想要使用 - urllib3requests


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