В чем отличия между модулем urllib, urllib2 и запросов?
В Python, каковы различия между модулями urllib
, urllib2
и requests
? Почему их три? Они, похоже, делают то же самое...
Ответы
Ответ 1
Я знаю, что это уже было сказано, но я очень рекомендую пакет Python requests
.
Если вы использовали языки, отличные от python, вы, вероятно, думаете, что urllib
и urllib2
просты в использовании, не так много кода и urllib2
высокой способностью, как я привык думать. Но пакет requests
настолько невероятно полезен и короток, что каждый должен его использовать.
Во-первых, он поддерживает полностью релаксирующий API и так же прост, как:
import requests
resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')
Независимо от того, используется ли GET/POST, вам больше никогда не придется кодировать параметры, он просто принимает словарь в качестве аргумента и хорошо идти:
userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)
Кроме того, он даже имеет встроенный JSON-декодер (опять же, я знаю, что json.loads()
писать не так уж и много, но это, json.loads()
удобно):
resp.json()
Или, если ваши данные ответа - просто текст, используйте:
resp.text
Это только верхушка айсберга. Это список функций с сайта запросов:
- Международные домены и URL
- Keep-Alive & Connection Pooling
- Сессии с сохранением Cookie
- Проверка SSL в стиле браузера
- Базовая/дайджест-аутентификация
- Элегантный ключ/ценное печенье
- Автоматическая декомпрессия
- Ответные органы Unicode
- Загрузка нескольких файлов
- Время ожидания подключения
- Поддержка .netrc
- Элемент списка
- Python 2.6—3.4
- Потокобезопасна.
Ответ 2
urllib2 предоставляет некоторую дополнительную функциональность, а именно функция urlopen()
может указывать заголовки (обычно вам приходилось использовать httplib в прошлом, что гораздо более многословно). Более того, хотя urllib2 предоставляет Request
, что позволяет использовать более декларативный подход к выполнению запроса:
r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)
Обратите внимание, что urlencode()
находится только в urllib, а не urllib2.
Существуют также обработчики для реализации более продвинутой поддержки URL-адресов в urllib2. Короткий ответ: если вы не работаете с устаревшим кодом, вы, вероятно, захотите использовать открыватель URL из urllib2, но вам все равно нужно импортировать в urllib для некоторых функций утилиты.
Бонусный ответ
С помощью Google App Engine вы можете использовать любые httplib, urllib или urllib2, но все они всего лишь обертки API API для URL-адресов Google. То есть вы по-прежнему подвергаетесь тем же ограничениям, что и порты, протоколы и длина разрешенного ответа. Вы можете использовать ядро библиотек, как вы ожидали бы для получения URL-адресов HTTP.
Ответ 3
urllib и urllib2 - это оба модуля Python, которые связаны с запросами URL, но предлагают разные функциональные возможности.
1) urllib2 может принять объект Request для установки заголовков для URL-запроса, urllib принимает только URL-адрес.
2) urllib предоставляет метод urlencode, который используется для генерации строк запроса GET, urllib2 не имеет такой функции. Это одна из причин, почему urllib часто используется вместе с urllib2.
Запросы. Запросы - это простая, простая в использовании HTTP-библиотека, написанная на Python.
1) Запросы Python автоматически кодируют параметры, поэтому вы просто передаете их как простые аргументы, в отличие от urllib, где вам нужно использовать метод urllib.encode() для кодирования параметров перед их прохождением.
2) Он автоматически декодировал ответ в Юникоде.
3) Запросы также имеют гораздо более удобную обработку ошибок. Если ваша аутентификация не удалась, urllib2 поднимет urllib2.URLError, в то время как Requests вернет нормальный объект ответа, как и ожидалось. Все, что вам нужно, чтобы убедиться, что запрос был успешным с помощью boolean response.ok
Например, ссылка - https://dancallahan.info/journal/python-requests/
Ответ 4
urllib2.urlopen принимает экземпляр класса Request или url, тогда как urllib.urlopen принимает только URL.
Аналогичное обсуждение имело место здесь:
http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html
Ответ 5
Мне нравится функция urllib.urlencode
, и она, похоже, не существует в urllib2
.
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
Ответ 6
Значительное различие заключается в переносе Python2 на Python3. urllib2 не существует для python3 и его методы переносятся на urllib.
Таким образом, вы используете это сильно и хотите перейти на Python3 в будущем, подумайте об использовании urllib.
Однако инструмент 2to3 автоматически выполнит большую часть работы для вас.
Ответ 7
Просто чтобы добавить к существующим ответам, я не вижу, чтобы кто-то упоминал, что запросы python не являются родной библиотекой. Если вы согласны с добавлением зависимостей, тогда запросы будут прекрасными. Однако, если вы пытаетесь избежать добавления зависимостей, urllib - это родная библиотека python, которая уже доступна вам.
Ответ 8
Обычно вы должны использовать urllib2, так как это делает вещи немного проще, принимая объекты Request, а также вызывает URLException при ошибках протокола. В Google App Engine вы тоже не можете использовать. Вы должны использовать API API URL-адресов, который предоставляет Google в изолированной среде Python.
Ответ 9
Чтобы получить содержание URL:
try: # Try importing requests first.
import requests
except ImportError:
try: # Try importing Python3 urllib
import urllib.request
except AttributeError: # Now importing Python2 urllib
import urllib
def get_content(url):
try: # Using requests.
return requests.get(url).content # Returns requests.models.Response.
except NameError:
try: # Using Python3 urllib.
with urllib.request.urlopen(index_url) as response:
return response.read() # Returns http.client.HTTPResponse.
except AttributeError: # Using Python3 urllib.
return urllib.urlopen(url).read() # Returns an instance.
Это трудно написать python2 и Python3 и request
зависимостей кода для ответов, потому что они urlopen()
функции и requests.get()
функция возвращает различные типы:
- Python2
urllib.request.urlopen()
возвращает http.client.HTTPResponse
- Python3
urllib.urlopen(url)
возвращает instance
- Запрос
request.get(url)
возвращает requests.models.Response
Ответ 10
Ключевой момент, который я нахожу отсутствующим в приведенных выше ответах, заключается в том, что urllib возвращает объект типа <class http.client.HTTPResponse>
тогда как requests
возвращают <class 'requests.models.Response'>
<class http.client.HTTPResponse>
<class 'requests.models.Response'>
.
В связи с этим метод read() может использоваться с urllib
но не с requests
.
PS: requests
уже богаты таким количеством методов, что вряд ли нужен еще один, как read()
;>