Разница между Python urllib.urlretrieve () и wget - PullRequest
12 голосов
/ 06 мая 2010

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

Ответы [ 2 ]

17 голосов
/ 12 мая 2010

Ответ довольно прост. urllib и urllib2 у Python далеко не такие зрелые и надежные, какими они могли бы быть. Даже лучше, чем wget в моем опыте cURL. Я написал код, который загружает гигабайты файлов по HTTP с размерами файлов от 50 КБ до более 2 ГБ. Насколько мне известно, cURL является самым надежным программным обеспечением на планете на данный момент для этой задачи. Я не думаю, что Python, Wget или даже большинство веб-браузеров могут соответствовать ему с точки зрения правильности и надежности реализации. На достаточно современном Python, использующем urllib2 точно правильным образом, его можно сделать довольно надежным, но я все еще использую подпроцесс curl, и это абсолютно надежно.

Еще один способ заявить, что cURL делает только одну вещь, и он делает это лучше, чем любое другое программное обеспечение, потому что у него было намного больше разработки и усовершенствования. Python urllib2 удобен в обслуживании и удобен и работает достаточно хорошо для небольших и средних рабочих нагрузок, но cURL далеко впереди в плане надежности.

Кроме того, cURL имеет множество опций для настройки поведения надежности, включая количество повторов, значения времени ожидания и т. Д.

2 голосов
/ 06 мая 2010

Если вы используете:

page = urllib.retrieve('http://example.com/really_big_file.html')

, вы создаете строку размером 500 МБ, которая может облагать налогом вашу машину, замедлять работу и вызывать тайм-аут соединения.Если это так, вы должны использовать:

(filename, headers) = urllib.retrieve('http://...', 'local_outputfile.html')

, что не облагается налогом переводчика.

Стоит отметить, что urllib.retrieve () использует urllib.urlopen (), которыйустарела .

...