Python を使用して 500 MB のファイルを取得しようとしていますが、urllib.urlretrieve()
. この呼び出しが一貫してハングし、完了しないため、私とダウンロード サイトの間に何らかのネットワークの問題があるようです。ただし、 を使用wget
してファイルを取得すると、問題なく動作する傾向があります。この違いを引き起こす可能性があるurlretrieve()
との違いは何ですか?wget
2 に答える
答えは非常に簡単です。Python のurllib
とurllib2
は、可能な限り成熟しており、堅牢ではありません。私の経験では wget よりもさらに優れているのはcURL
. HTTP 経由でファイル サイズが 50 KB から 2 GB 以上のギガバイト単位のファイルをダウンロードするコードを作成しました。私の知る限り、cURL は、このタスクに関して現時点で地球上で最も信頼できるソフトウェアです。Python、wget、またはほとんどの Web ブラウザーでさえ、実装の正確さと堅牢性の点でそれに匹敵するとは思いません。urllib2を正確に正しい方法で使用する最新のpythonでは、かなり信頼性を高めることができますが、それでもcurlサブプロセスを実行しており、それは絶対に堅実です。
これを別の言い方をすれば、cURL は 1 つのことだけを行い、他のどのソフトウェアよりも優れているということです。これは、はるかに多くの開発と改良が行われているためです。Pythonurllib2
は実用的で便利で、小規模から平均的なワークロードには十分に機能しますが、信頼性の点では cURL がはるかに優れています。
また、cURL には、再試行回数、タイムアウト値など、信頼性の動作を調整する多数のオプションがあります。
使用している場合:
page = urllib.retrieve('http://example.com/really_big_file.html')
500 MBの文字列を作成しているため、マシンに負担がかかり、速度が低下し、接続がタイムアウトする可能性があります。その場合は、以下を使用する必要があります。
(filename, headers) = urllib.retrieve('http://...', 'local_outputfile.html')
通訳に課税されません。
urllib.retrieve()がurllib.urlopen( )を使用していることは注目に値しますが、現在は非推奨になっています。