В Python, каковы различия между urllib
, urllib2
, urllib3
и requests
модулей? Почему их три? Кажется, они делают то же самое ...
python
python-requests
urllib2
urllib
python-2.x
Пол Биггар
источник
источник
requests
большую часть времени. иногдаurllib2
работает, но требует больше кода и менее элегантно. не использоватьurllib
.urllib
в Python 3 есть еще один вариант, очищенный различными способами. Но , к счастью, официальная документация также отмечает , что « Пакет запросов рекомендуется для интерфейса HTTP клиента более высокого уровня. » В 21,6. urllib.request - Расширяемая библиотека для открытия URL-адресов - Документация по Python 3.6.3Ответы:
Я знаю, что это уже было сказано, но я очень рекомендую
requests
пакет Python.Если вы использовали языки, отличные от python, вы, вероятно, думаете
urllib
иurllib2
просты в использовании, не так много кода и обладаете высокой способностью, как я привык думать. Ноrequests
пакет настолько невероятно полезен и короток, что каждый должен его использовать.Во-первых, он поддерживает полностью релаксирующий API и так же прост, как:
Независимо от того, используется ли GET / POST, вам больше никогда не придется кодировать параметры, он просто принимает словарь в качестве аргумента и хорошо идти:
Кроме того, он даже имеет встроенный JSON-декодер (опять же, я знаю,
json.loads()
что писать не так уж и много, но это, безусловно, удобно):Или, если ваши данные ответа - просто текст, используйте:
Это только верхушка айсберга. Это список функций с сайта запросов:
источник
urllib
и что в ее документации также официально отмечается, что « пакет Requests рекомендуется для высокоуровневого клиентского интерфейса HTTP » на 21.6. urllib.request - Расширяемая библиотека для открытия URL - Документация Python 3.6.3 , иurllib3
это отличная библиотека, используемаяrequests
.urllib.parse()
urllib2 предоставляет некоторую дополнительную функциональность, а именно эта
urlopen()
функция позволяет вам указывать заголовки (обычно вам приходилось использовать httplib в прошлом, что гораздо более многословно.) Что еще более важно, urllib2 предоставляетRequest
класс, который позволяет более декларативный подход к выполнению запроса:Обратите внимание, что
urlencode()
это только в urllib, а не urllib2.Есть также обработчики для реализации более продвинутой поддержки URL в urllib2. Короткий ответ: если вы не работаете с унаследованным кодом, вы, вероятно, захотите использовать средство для открытия URL-адресов из urllib2, но вам все равно нужно импортировать в urllib для некоторых служебных функций.
Бонусный ответ С помощью Google App Engine вы можете использовать любой из httplib, urllib или urllib2, но все они являются просто оболочками для Google Fetch API Google Fetch. Это значит, что вы по-прежнему подвержены тем же ограничениям, что и порты, протоколы и допустимая длина ответа. Вы можете использовать ядро библиотек так, как вы ожидаете получить HTTP-URL.
источник
urlopen()
иRequest
из urllib2 , и вы используетеurlencode()
из urllib . Никакого реального вреда в использовании обеих библиотек, при условии, что вы используете правильный urlopen. В [urllib docs] [1] ясно, что это допустимое использование. [1]: docs.python.org/library/urllib2.html#urllib2.urlopenurllib2.urlopen
; содержит и другие варианты.requests
также разрешить использование пользовательских заголовков: docs.python-requests.org/en/master/user/quickstart/…urllib и urllib2 оба являются модулями Python, которые выполняют связанные с URL запросы, но предлагают разные функциональные возможности.
1) urllib2 может принять объект Request для установки заголовков для запроса URL, urllib принимает только URL.
2) urllib предоставляет метод urlencode, который используется для генерации строк запроса GET, у urllib2 такой функции нет. Это одна из причин, почему urllib часто используется вместе с urllib2.
Запросы - Запросы '- это простая и простая в использовании библиотека HTTP, написанная на Python.
1) Python Requests автоматически кодирует параметры, поэтому вы просто передаете их как простые аргументы, в отличие от случая с urllib, где вам необходимо использовать метод urllib.encode () для кодирования параметров перед их передачей.
2) Он автоматически декодирует ответ в Unicode.
3) Запросы также имеют гораздо более удобную обработку ошибок. Если ваша аутентификация не удалась, urllib2 вызовет urllib2.URLError, тогда как Запросы вернут обычный объект ответа, как и ожидалось. Все, что вы должны увидеть, если запрос был успешно выполнен boolean response.ok
источник
Одно существенное отличие заключается в переносе Python2 на Python3. urllib2 не существует для python3, а его методы перенесены в urllib. Так что вы интенсивно используете это и хотите в будущем перейти на Python3, подумайте об использовании urllib. Однако инструмент 2to3 автоматически сделает большую часть работы за вас.
источник
Просто чтобы добавить к существующим ответам, я не вижу, чтобы кто-то упоминал, что запросы Python не являются нативной библиотекой. Если у вас все в порядке с добавлением зависимостей, тогда запросы в порядке. Однако, если вы пытаетесь избежать добавления зависимостей, urllib - это нативная библиотека Python, которая уже доступна для вас.
источник
Мне нравится
urllib.urlencode
функция, и она, кажется, не существует вurllib2
.источник
urllib
в Python 3 есть еще один вариант, очищенный различными способами. Но , к счастью, официальная документация также отмечает , что « Пакет запросов рекомендуется для HTTP клиента интерфейс более высокого уровня. » В 21,6. urllib.request - Расширяемая библиотека для открытия URL-адресов - Документация по Python 3.6.3Чтобы получить содержание URL:
Трудно написать Python2 и Python3 и
request
код зависимостей для ответов, потому что ониurlopen()
функции иrequests.get()
функции возвращают разные типы:urllib.request.urlopen()
возвращаетhttp.client.HTTPResponse
urllib.urlopen(url)
возвращаетinstance
request.get(url)
возвращаетrequests.models.Response
источник
Как правило, вы должны использовать urllib2, поскольку это иногда упрощает принятие объектов запроса и также вызывает исключение URLEx при ошибках протокола. Однако с Google App Engine вы не можете использовать ни того, ни другого. Вы должны использовать API URL Fetch, который Google предоставляет в изолированной среде Python.
источник
Ключевой момент, который я нахожу отсутствующим в приведенных выше ответах, заключается в том, что urllib возвращает объект типа,
<class http.client.HTTPResponse>
тогда какrequests
возвращает<class 'requests.models.Response'>
.В связи с этим метод read () может использоваться с,
urllib
но не сrequests
.PS:
requests
уже так много методов, что вряд ли нужно еще какread()
;>источник