Каковы различия между urllib, urllib2 и модулем запросов?

В Python, какие различия между urllib, urllib2, а также requests модуль? Почему их три? Кажется, они делают то же самое...

10 ответов

Решение

Я знаю, что это уже было сказано, но я настоятельно рекомендую пакет Python для Requests: http://docs.python-requests.org/en/latest/index.html

Если вы использовали языки, отличные от python, вы, вероятно, думаете, что urllib и 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() не так уж много, чтобы написать, но это, конечно, удобно):

resp.json()

Или, если ваши данные ответа - просто текст, используйте:

resp.text

Это только верхушка айсберга. Это список функций с сайта запросов:

  • Международные домены и URL
  • Keep-Alive & Connection Pooling
  • Сессии с сохранением Cookie
  • Проверка SSL в стиле браузера
  • Базовая / дайджест-аутентификация
  • Элегантный ключ / ценное печенье
  • Автоматическая декомпрессия
  • Ответные органы Unicode
  • Загрузка нескольких файлов
  • Время ожидания подключения
  • Поддержка.netrc
  • Элемент списка
  • Python 2.6—3.4
  • Потокобезопасна.

Это мое понимание отношений между различными urllib:

В стандартной библиотеке Python 2 существуют две библиотеки HTTP бок о бок. Несмотря на похожее название, они не связаны между собой: у них другой дизайн и другая реализация.

  • urllib был оригинальным HTTP-клиентом Python, добавленным в стандартную библиотеку в Python 1.2.
  • urllib2 - это более функциональная HTTP-библиотека, добавленная в Python 1.6 и призванная в конечном итоге заменить urllib.

Стандартная библиотека Python 3 имеет новый urllib, который представляет собой объединенную / отремонтированную / переписанную версию этих двух пакетов.

urllib3 - сторонний пакет. Несмотря на название, он не имеет отношения к пакетам стандартной библиотеки, и нет намерения включать его в стандартную библиотеку в будущем.

Наконец, в запросах используется urllib3, но он нацелен на более простой в использовании API.

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, но все они являются просто оболочками для Google Fetch API Google Fetch. Это значит, что вы по-прежнему подвержены тем же ограничениям, что и порты, протоколы и допустимая длина ответа. Вы можете использовать ядро ​​библиотек так, как вы ожидаете получить HTTP-URL.

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

Например, ссылка - https://dancallahan.info/journal/python-requests/

Просто чтобы добавить к существующим ответам, я не вижу никого, кто бы упоминал, что запросы Python не являются нативной библиотекой. Если вы в порядке с добавлением зависимостей, тогда запросы в порядке. Однако, если вы пытаетесь избежать добавления зависимостей, urllib - это нативная библиотека Python, которая уже доступна для вас.

Одно существенное отличие заключается в переносе Python2 на Python3. urllib2 не существует для python3 и его методы перенесены в urllib. Так что вы интенсивно используете это и хотите в будущем перейти на Python3, подумайте об использовании urllib. Однако инструмент 2to3 автоматически выполнит большую часть работы за вас.

Я думаю, что все ответы хороши. Но меньше подробностей о urllib3.urllib3 - очень мощный HTTP-клиент для python. Для установки будут работать обе следующие команды:

urllib3

используя pip,

pip install urllib3

или вы можете получить последний код из Github и установить их, используя,

$ git clone git://github.com/urllib3/urllib3.git
$ cd urllib3
$ python setup.py install

Тогда вы готовы к работе,

Просто импортируйте urllib3, используя,

import urllib3

Здесь вместо того, чтобы создавать соединение напрямую, вам понадобится экземпляр PoolManager для выполнения запросов. Это обрабатывает за вас пул соединений и безопасность потоков. Также существует объект ProxyManager для маршрутизации запросов через прокси HTTP/HTTPS. Здесь вы можете обратиться к документации. пример использования:

>>> from urllib3 import PoolManager
>>> manager = PoolManager(10)
>>> r = manager.request('GET', 'http://google.com/')
>>> r.headers['server']
'gws'
>>> r = manager.request('GET', 'http://yahoo.com/')
>>> r.headers['server']
'YTS/1.20.0'
>>> r = manager.request('POST', 'http://google.com/mail')
>>> r = manager.request('HEAD', 'http://google.com/calendar')
>>> len(manager.pools)
2
>>> conn = manager.connection_from_host('google.com')
>>> conn.num_requests
3

Как упоминалось в urrlib3 документация,urllib3 приносит много важных функций, которые отсутствуют в стандартных библиотеках Python.

  • Безопасность потоков.
  • Пул соединений.
  • Проверка SSL/TLS на стороне клиента.
  • Загрузка файлов с многокомпонентной кодировкой.
  • Помощники для повторных запросов и обработки переадресации HTTP.
  • Поддержка кодирования gzip и deflate.
  • Поддержка прокси для HTTP и SOCKS.
  • 100% тестовое покрытие.

Следуйте руководству пользователя для получения более подробной информации.

requests

запросы использует urllib3 под капотом и сделать его еще проще requestsи получить данные. Во-первых, сохранение активности на 100% автоматическое, по сравнению сurllib3где его нет. Он также имеет перехватчики событий, которые вызывают функцию обратного вызова, когда событие запускается, например получение ответа вrequests, у каждого типа запроса своя функция. Таким образом, вместо создания соединения или пула вы напрямую ПОЛУЧАЕТЕ URL-адрес.


Для установки requests используя pip, просто запустите

pip install requests

или вы можете просто установить из исходного кода,

$ git clone git://github.com/psf/requests.git
$ cd requests
$ python setup.py install

Затем, import requests

Здесь вы можете обратиться к официальной документации. Для расширенного использования, такого как объект сеанса, проверка SSL и перехватчики событий, обратитесь к этому URL-адресу.

Мне нравится urllib.urlencode функция, и она не существует в urllib2,

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'

urllib2.urlopen принимает экземпляр класса Request или url, тогда как urllib.urlopen принимает только url.

Подобное обсуждение состоялось здесь: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html

To get the content of a 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.

It's hard to write Python2 and Python3 and request dependencies code for the responses because they urlopen() функции и requests.get() function return different types:

  • python2 urllib.request.urlopen() возвращает http.client.HTTPResponse
  • python3 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();>

Другие вопросы по тегам