В чем отличия между модулем 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/

Ответ 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() ;>