2009-06-10 15 views
8

私はウェブサイトからデータのGBSをダウンロードするタスクがあります。データは.gzファイルの形式であり、各ファイルのサイズは45MBです。wget対Pythonのurlretrieve

ファイルを簡単に取得するには、「wget -r -np -A files url」を使用します。これにより、再帰的な形式でデータをドローロードし、Webサイトを反映します。ドンロード率は4mb/secと非常に高い。

しかし、周りを遊ぶために私は私のurlparserを構築するためにpythonも使用していました。

Pythonのurlretrieve経由でのダウンロードは、遅いですが、可能な速度はwgetの4倍です。ダウンロード速度は500kb /秒です。 hrefタグを解析するためにHTMLParserを使用します。

なぜこのようなことが起こっているのかわかりません。このための設定はありますか?

ありがとうございました

+1

CPU使用率とtcpdump出力を比較しようとしましたか? –

+0

tcpdumpとは何ですか?それを得る方法? –

+1

私は転送速度(メガバイト/ MBとメガビット/ Mbはまったく異なります!)を無視して、 'time wget http:// example.com/file'と' time python urlretrieve_downloader.py'コマンドを使って2つを比較します。 – dbr

答えて

1

多分、あなたはwgetし、Pythonのデータを調べることができますか?

+0

申し訳ありませんが、私はあなたが何を意味するのか理解できません。あなたはPythonコードからwgetを呼び出すと言っていますか? –

+0

あなたは、またはシェルから、速いダウンロード速度を利用することができます。そして、Pythonを使ってデータを処理します。ここ –

0

本当に違いはありません。すべてのurlretrieveは簡単なHTTP GETリクエストを作成します。データ処理コードを取り出して、wgetと純粋なPythonのスループット比較を行いましたか?

0

いくつかのコードを表示してください。私はそれがコードであり、urlretrieveではないと確信しています。

私は過去にそれを使っていましたが、スピードに関連する問題は一度もありませんでした。

+0

は、コード...です。http://cs.jhu.edu/~kapild/MyHtmlParser1.py urlretrieveは最後から二番目の行にある –

1
import subprocess 

myurl = 'http://some_server/data/' 
subprocess.call(["wget", "-r", "-np", "-A", "files", myurl]) 
+0

サブプロセスは、あなたの友人は非常に良い点 –

3

、最速/最も簡単なHTTPのために自分を要求したとして、あなたはおそらくlxml を使用しているれます:httplib2は非常に使いやすいです、そしてそれは、HTTP 1.1キープアライブサポートしているので、おそらくダウンロードをスピードアップすることができ接続とgzip圧縮。非常に速い(しかし、使用するのが難しい)と主張し、curllibをベースに構築されているpycURLもありますが、私はそれを使ったことはありません。

また、別のファイルを同時にダウンロードしようとすることもできますが、ダウンロード時間をあまりにも短くしようとすると、問題のWebサイトに対してあまり丁寧でない可能性があります。

ハイパーリンクの不足のため申し訳ありませんが、SO私に語った次のスクリプト、と試みることができる

+0

を追加しました:-) – Triptych

+0

解析が問題なのかどうかわかりません...遅延を引き起こしているファイルの取得と保存中... –

3

転送速度が簡単に誤解を招くことができます..「申し訳ありませんが、新規ユーザーは、唯一のハイパーリンクの最大値を投稿することができます」ととurllib.urlretrieveの両方で同じURLをダウンロードするだけです。2度目の試行でURLをキャッシュするプロキシの背後にいる場合は、数回実行してください。

小さなファイルの場合、外部プロセスの起動時間のためにwgetはわずかに長くなりますが、大量のファイルは無関係になるはずです。

from time import time 
import urllib 
import subprocess 

target = "http://example.com" # change this to a more useful URL 

wget_start = time() 

proc = subprocess.Popen(["wget", target]) 
proc.communicate() 

wget_end = time() 


url_start = time() 
urllib.urlretrieve(target) 
url_end = time() 

print "wget -> %s" % (wget_end - wget_start) 
print "urllib.urlretrieve -> %s" % (url_end - url_start) 
8

urllibはwgetと同じくらい速く動作します。このコードを試してください。それはちょうどwgetと同様に進行状況をパーセンテージで示します。

import sys, urllib 
def reporthook(a,b,c): 
    # ',' at the end of the line is important! 
    print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b)/c * 100), c), 
    #you can also use sys.stdout.write 
    #sys.stdout.write("\r% 3.1f%% of %d bytes" 
    #     % (min(100, float(a * b)/c * 100), c) 
    sys.stdout.flush() 
for url in sys.argv[1:]: 
    i = url.rfind('/') 
    file = url[i+1:] 
    print url, "->", file 
    urllib.urlretrieve(url, file, reporthook) 
0

wget -kを使用すると、すべてのURLの相対リンクを使用できます。

1

urllibの代わりにurllib2を使用するように提案されているので、私はurllib2.urlopenwgetの間のテストを受けます。

結果として、両方が同じファイルをダウンロードするのにほぼ同じ時間がかかります。urllib2はさらに優れたパフォーマンスを発揮します。

wgetの利点は、転送時の完了率と現在のダウンロード速度を示す動的プログレスバーにあります。

私のテストでのファイルサイズは5MBです。私はpythonでキャッシュモジュールを使用していませんでしたし、大きなサイズのファイルをダウンロードするときにはどのようにwgetが動作するのか分かりません。