Я пытаюсь получить файл 500mb с использованием Python, и у меня есть script, который использует urllib.urlretrieve()
. Кажется, есть некоторые проблемы с сетью между мной и сайтом загрузки, так как этот вызов постоянно зависает и не завершается. Однако использование wget
для извлечения файла имеет тенденцию работать без проблем. В чем разница между urlretrieve()
и wget
, которые могут вызвать эту разницу?
Разница между Python urllib.urlretrieve() и wget
Ответ 1
Ответ довольно прост. Python urllib
и urllib2
нигде не являются такими зрелыми и надежными, какими они могут быть. Даже лучше, чем wget в моем опыте cURL
. Я написал код, который загружает гигабайты файлов по HTTP с размером файлов от 50 КБ до более 2 ГБ. Насколько мне известно, cURL является самой надежной частью программного обеспечения на планете прямо сейчас для этой задачи. Я не думаю, что python, wget или даже большинство веб-браузеров могут соответствовать ему с точки зрения правильности и надежности реализации. На достаточно современном питоне, использующем urllib2 в точном правильном направлении, его можно сделать довольно надежным, но я все еще выполняю подпроцесс curl и абсолютно прочный.
Другой способ заявить, что cURL делает только одну вещь, и делает это лучше, чем любое другое программное обеспечение, потому что оно имеет гораздо больше возможностей для разработки и уточнения. Python urllib2
исправна и удобна и работает достаточно хорошо для малых и средних рабочих нагрузок, но cURL продвигается вперед с точки зрения надежности.
Кроме того, cURL имеет множество опций для настройки поведения надежности, включая количество попыток, значения тайм-аута и т.д.
Ответ 2
Если вы используете:
page = urllib.retrieve('http://example.com/really_big_file.html')
вы создаете строку 500mb, которая вполне может наложить налог на ваш компьютер, сделать его медленным и вызвать соединение с таймаутом. Если это так, вы должны использовать:
(filename, headers) = urllib.retrieve('http://...', 'local_outputfile.html')
который не будет облагать налогом переводчика.
Стоит отметить, что urllib.retrieve() использует urllib.urlopen(), который теперь устарел.