Каковы различия между urllib, urllib2 и модулем запросов? - PullRequest
637 голосов
/ 07 января 2010

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

Ответы [ 10 ]

623 голосов
/ 11 февраля 2013

Я знаю, что это уже было сказано, но я очень рекомендую requests пакет Python.

Если вы использовали языки, отличные от 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 и пул соединений
  • сеансов с сохранением cookie
  • Проверка SSL в стиле браузера
  • Базовая / дайджест-аутентификация
  • Элегантный ключ / ценное печенье
  • Автоматическая декомпрессия
  • Органы ответа Unicode
  • Загрузка нескольких файлов
  • Время ожидания подключения
  • .netrc поддержка
  • Элемент списка
  • Python 2.6—3.4
  • потокобезопасна.
191 голосов
/ 07 января 2010

urllib2 предоставляет некоторые дополнительные функции, а именно функция urlopen() позволяет вам указывать заголовки (обычно вам приходилось использовать httplib в прошлом, что гораздо более многословно.) Что еще более важно, urllib2 предоставляет * Класс 1002 *, который допускает более декларативный подход к выполнению запроса:

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

37 голосов
/ 10 сентября 2016

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, тогда как Запросы вернут обычный объект ответа, как и ожидалось. Все, что вы должны увидеть, если запрос был успешным - логическое response.ok

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

12 голосов
/ 07 января 2010

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

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

10 голосов
/ 07 января 2010

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

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
9 голосов
/ 27 апреля 2016

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

6 голосов
/ 30 октября 2017

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

5 голосов
/ 20 декабря 2017

Чтобы получить содержание 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
5 голосов
/ 07 января 2010

Как правило, вы должны использовать urllib2, так как это иногда упрощает принятие объектов Request и также вызывает исключение URLEx при ошибках протокола. С Google App Engine вы не можете использовать и то, и другое. Вы должны использовать URL Fetch API , который Google предоставляет в изолированной среде Python.

1 голос
/ 14 декабря 2018

Ключевым моментом, который я нахожу пропущенным в ответах выше, является то, что urllib возвращает объект типа <class http.client.HTTPResponse>, тогда как requests возвращает <class 'requests.models.Response'>.

В связи с этим метод read () может использоваться с urllib, но не с requests.

P.S. : requests уже богат таким количеством методов, что вряд ли нужен еще один, как read();>

...