并发下载 - Python

时间:2010-03-02 01:14:58

标签: python html concurrency web-crawler

计划如下:

我下载一个网页,收集在DOM中解析的图像列表,然后下载这些图像。在此之后,我将迭代图像,以评估哪个图像最适合代表网页。

问题是图像是逐个下载的,这可能需要一段时间。


如果有人能指出我关于这个话题的某些方向,那就太棒了。

非常感谢帮助。

4 个答案:

答案 0 :(得分:13)

加快抓取速度基本上是Eventlet的主要用例。它的速度非常快 - 我们的应用程序必须在几分钟内达到2,000,000个网址。它利用系统上最快的事件接口(通常是epoll),并使用greenthreads(它们建立在协同程序之上并且非常便宜),以便于编写。

这是an example from the docs

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寻求帮助。

[更新:我在文档中添加了更复杂的recursive web crawler example。我发誓这是在提出这个问题之前正在进行的工作,但这个问题最终激励我完成它。 :)]

答案 1 :(得分:6)

虽然线程肯定是可能的,但我建议asyncore - 有一个很好的例子here,它可以准确地显示两个URL的同时提取(很容易推广到任何URL列表!)

答案 2 :(得分:4)

Here是一篇关于使用url抓取作为示例的线程的文章。

答案 3 :(得分:0)

现在您可能想要使用优秀的Python库 - urllib3requests