2016-08-15 9 views
0

私は約500kの小さなcsvファイル(5kb-1mb)をURLリストからダウンロードしようとしていますが、これを行うには時間がかかりすぎています。コードにつきましては、1日に10kファイルを取得すれば運がいいです。Pythonを使用して何千ものファイルをダウンロードする

複数のファイルを同時にダウンロードするために、マルチプロセッシングパッケージとプールを使用しようとしました。これは、最初の数千回のダウンロードで効果的と思われますが、最終的に全体の速度が低下します。私は専門家ではありませんが、速度の低下は、ダウンロードしようとしているサーバーがこの数の要求に追いついていないことを示しています。それは意味がありますか?

私はここでかなり失われており、これをスピードアップする方法についてアドバイスがあれば疑問に思っていました。

import urllib2 
import pandas as pd 
import csv 
from multiprocessing import Pool 

#import url file 
df = pd.read_csv("url_list.csv") 

#select only part of the total list to download 
list=pd.Series(df[0:10000]) 


#define a job and set file name as the id string under urls 
def job(url): 
    file_name = str("test/"+url[46:61])+".csv" 
    u = urllib2.urlopen(url) 
    f = open(file_name, 'wb') 
    f.write(u.read()) 
    f.close() 

#run job 
pool = Pool() 
url = [ "http://" + str(file_path) for file_path in list] 
pool.map(job, url) 
+0

すべてのURLをテキストファイルに書き込んでから、 'aria2'のようなダウンロードマネージャを使用してダウンロードしてください:-) – aliva

+0

あなたの提案に感謝して、うまくいくと思います。私はaria2のドキュメントを読んできましたが、ファイルの名前を付ける方法が見つかりません。ダウンロードしたファイルにurl(またはその部分文字列)を付けて名前を付けることができるかどうか知っていますか? – tan

+0

'aria2c -i file.txt' – aliva

答えて

-1

ホイールを再コーディングしています。あなたのディストリビューションのためのparallelaxelをインストールする必要があります。もちろん、

parallel -a urls.file axel 

:どのようにそれについて

axel

parrallelあなたはマルチスレッドを使用してタスクを実行することができますwgetにマルチスレッド対応です。

+0

コメントありがとうございます。それもうまく動作しますが、私はまだファイルの名前を正しく苦労しています。 csvは元のURLに関する情報を保持していないため、これが最も重要です。 – tan

関連する問題