9

Web サイトから Gbs のデータをダウンロードするタスクがあります。データは .gz ファイルの形式で、各ファイルのサイズは 45 MB です。

ファイルを取得する簡単な方法は、「wget -r -np -A files url」を使用することです。これにより、再帰的な形式でデータがダウンロードされ、Web サイトがミラーリングされます。ダウンロード速度は非常に高く、4 mb/秒です。

しかし、ただ遊んでみるために、python を使用して urlparser を構築していました。

Python の urlretrieve によるダウンロードは非常に遅く、wget の 4 倍遅くなる可能性があります。ダウンロード速度は 500kb/秒です。href タグの解析には HTMLParser を使用します。

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

ありがとう

4

10 に答える 10

40

おそらくあなたの側の単位計算エラーです。

500KB /s (キロバイト) は 4Mb/s (メガビット) に等しいことに注意してください。

于 2009-06-10T18:14:50.453 に答える
3

HTML解析に関しては、おそらくlxmlを使用するのが最も速く/簡単です 。httpリクエスト自体について:httplib2は非常に使いやすく、http 1.1キープアライブ接続とgzip圧縮をサポートしているため、ダウンロードを高速化できる可能性があります。非常に高速であると主張し(ただし、使用するのがより難しい)、curllib上に構築されているpycURLもありますが、私はそれを使用したことがありません。

異なるファイルを同時にダウンロードすることもできますが、ダウンロード時間を最適化しすぎると、問題のWebサイトに対してあまり礼儀正しくない可能性があることに注意してください。

ハイパーリンクが不足していることをお詫びしますが、SOは「申し訳ありませんが、新規ユーザーは最大1つのハイパーリンクしか投稿できません」と言っています。

于 2009-06-10T18:46:07.303 に答える
3

転送速度は簡単に誤解を招く可能性があります.次のスクリプトを試してみてください。これは、両方wgetで同じ URL をダウンロードするだけですurllib.urlretrieve- 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)
于 2009-06-11T13:47:59.427 に答える
1

Python はurllib2の代わりに を使用することを提案しているため、 とurllibの間でテストをurllib2.urlopen行いwgetます。

その結果、両者が同じファイルをダウンロードするのにほぼ同じ時間がかかりますurllib2

の利点はwget、転送時に完了した割合と現在のダウンロード速度を表示する動的な進行状況バーにあります。

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

于 2011-10-16T07:13:37.137 に答える
1

たぶん、Python で wget してからデータを調べることができますか?

于 2009-06-10T10:38:52.667 に答える
1
import subprocess

myurl = 'http://some_server/data/'
subprocess.call(["wget", "-r", "-np", "-A", "files", myurl])
于 2009-06-10T18:10:46.670 に答える
0

コードを見せてください。urlretrieve ではなく、コードを使用する必要があると確信しています。

私は過去にそれを使用してきましたが、速度に関連する問題は一度もありませんでした。

于 2009-06-10T14:59:41.270 に答える
0

本当に違いはないはずです。urlretrieve が行うことは、単純な HTTP GET 要求を作成することだけです。データ処理コードを取り出して、wget と純粋な python のスループットを直接比較しましたか?

于 2009-06-10T13:55:34.127 に答える
0

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

于 2010-02-28T09:35:55.877 に答える