Подтвердить что ты не робот

Разница между Python urllib.urlretrieve() и wget

Я пытаюсь получить файл 500mb с использованием Python, и у меня есть script, который использует urllib.urlretrieve(). Кажется, есть некоторые проблемы с сетью между мной и сайтом загрузки, так как этот вызов постоянно зависает и не завершается. Однако использование wget для извлечения файла имеет тенденцию работать без проблем. В чем разница между urlretrieve() и wget, которые могут вызвать эту разницу?

4b9b3361

Ответ 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(), который теперь устарел.