【问题标题】:Concurrent downloads - Python并发下载 - Python
【发布时间】:2010-03-02 01:14:57
【问题描述】:

计划是这样的:

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

问题是图像是一张一张地下载的,这可能需要相当长的时间。


如果有人能就该主题向我指出一些方向,那就太好了。

非常感谢您的帮助。

【问题讨论】:

    标签: python html concurrency web-crawler


    【解决方案1】:

    加速爬取基本上是Eventlet的主要用例。它非常快——我们有一个应用程序必须在几分钟内访问 2,000,000 个 url。它利用系统上最快的事件接口(通常是 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。我发誓在提出这个问题之前它已经在进行中,但这个问题最终确实激励我完成它。 :)]

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        Here 是一篇关于线程的文章,它以 url fetching 为例。

        【讨论】:

          【解决方案4】:

          如今,您可能想使用一些出色的 Python 库 - urllib3 和 requests

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-01-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-24
            • 2020-04-16
            • 1970-01-01
            相关资源
            最近更新 更多