3

Pythonで、どうすれば大量のファイルをすばやくダウンロードできますか?urllib.urlretrieve()非常に遅いです、そして私はこれについてどうやって行くのかよくわかりません。

ダウンロードする15〜20個のファイルのリストがありますが、ダウンロードするだけで永遠にかかります。各ファイルは約2〜4MBです。

私はこれまでこれを行ったことがなく、どこから始めればよいのかよくわかりません。スレッドを使用して、一度にいくつかをダウンロードする必要がありますか?または、スレッドを使用して各ファイルの一部をダウンロードする必要がありますが、一度に1つのファイルをダウンロードする必要がありますか、それともスレッドを使用する必要がありますか?

4

4 に答える 4

3

Pythonのwgetモジュールを使用してみてください。これがコードスニペットです。

import wget
wget.download(url, out = path)
于 2020-10-19T04:20:15.723 に答える
1

1つの解決策(Python固有ではありません)は、ダウンロードURLを別のファイルに保存し、 wgetaria2などのダウンロードマネージャープログラムを使用してダウンロードすることです。Pythonプログラムからダウンロードマネージャーを呼び出すことができます。

しかし、@ Jonが述べたように、これはあなたの場合には本当に必要ではありません。urllib.urlretrieve()それで十分です!

もう1つのオプションは、Mechanizeを使用してファイルをダウンロードすることです。

于 2012-12-23T20:43:53.423 に答える
1

urllib.urlretrieve()は非常に遅い

本当に?それぞれ2〜4 MBのファイルが15〜20個ある場合は、「それらを並べてダウンロードする」だけです。ボトルネックは、サーバーと自分自身のバンドウィズになります。ですから、私見ですが、この場合、スレッド化したり、何か賢いことを試したりする価値はほとんどありません...

于 2012-12-23T20:35:19.350 に答える
0

stream.pyは、データフロープログラミングのアイデアに基づいた、(スレッドまたはプロセスを介した)並列Python用のやや実験的でありながらかわいいUIです。URLリトリーバーは次の例で提供されています。

短いので:

#!/usr/bin/env python

"""
Demonstrate the use of a ThreadPool to simultaneously retrieve web pages.
"""

import urllib2
from stream import ThreadPool

URLs = [
    'http://www.cnn.com/',
    'http://www.bbc.co.uk/',
    'http://www.economist.com/',
    'http://nonexistant.website.at.baddomain/',
    'http://slashdot.org/',
    'http://reddit.com/',
    'http://news.ycombinator.com/',
]

def retrieve(urls, timeout=30):
    for url in urls:
        yield url, urllib2.urlopen(url, timeout=timeout).read()

if __name__ == '__main__':
    retrieved = URLs >> ThreadPool(retrieve, poolsize=4)
    for url, content in retrieved:
        print '%r is %d bytes' % (url, len(content))
    for url, exception in retrieved.failure:
        print '%r failed: %s' % (url, exception)

に置き換える必要がありurllib2.urlopen(url, timeout=timeout).read()ますurlretrieve...

于 2012-12-23T20:39:35.017 に答える