并发下载 - Python

9 投票
4 回答
6758 浏览
提问于 2025-04-15 19:53

计划是这样的:

我下载一个网页,收集网页中所有的图片,然后把这些图片下载下来。之后,我会逐一查看这些图片,以判断哪一张最适合用来代表这个网页。

问题是,图片是一个一个下载的,这样会花费不少时间。


如果有人能给我一些关于这个话题的建议,那就太好了。

非常感谢任何帮助。

4 个回答

4

这里有一篇关于线程的文章,里面用获取网址作为例子来讲解。

6

虽然使用线程是一个可行的选择,但我更建议你使用asyncore。这里有一个很棒的例子在这里,它展示了如何同时获取两个网址(这个方法可以很容易地扩展到任何网址列表!)。

13

加快爬虫速度基本上就是Eventlet的主要用途。它非常快速——我们有一个应用需要在几分钟内访问2,000,000个网址。它利用了你系统中最快的事件接口(通常是epoll),并使用greenthreads(这是一种基于协程的轻量级线程)来简化编写过程。

这里有一个来自文档的示例

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频道里问。

[更新:我在文档中添加了一个更复杂的递归爬虫示例。我发誓在这个问题提出之前就已经在准备这个示例了,但这个问题确实激励我把它完成。:)]

撰写回答