Вопрос

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

Это было полезно?

Решение

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

Если вы использовали языки, отличные от python, вы, вероятно, думаете urllib и urllib2 они просты в использовании, не содержат большого количества кода и обладают высокими возможностями, вот как я раньше думал.Но тот requests пакет настолько невероятно полезен и короток, что им должен пользоваться каждый.

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

Другие советы

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

urllib и urllib2 это оба модуля Python, которые выполняют связанные с запросом URL вещи, но предлагают разные функциональные возможности.

1) urllib2 может принимать объект запроса для установки заголовков для запроса URL, urllib принимает только URL.

2) urllib предоставляет функция urlencode метод, который используется для генерации строк запроса GET, urllib2 не имеет такой функции.Это одна из причин, по которой urllib часто используется вместе с urllib2.

Запросы "Запросы" - это простая, понятная в использовании HTTP-библиотека, написанная на Python.

1) Python Requests автоматически кодирует параметры, поэтому вы просто передаете их как простые аргументы, в отличие от случая urllib, где вам нужно использовать метод urllib.кодировать() чтобы закодировать параметры перед их передачей.

2) Он автоматически декодировал ответ в Юникод.

3) Запросы также имеют гораздо более удобную обработку ошибок.Если ваша аутентификация не удалась, urllib2 вызовет urllib2.URLError , в то время как запросы будут возвращать обычный объект ответа, как и ожидалось.Все, что вам нужно, чтобы увидеть, был ли запрос успешным с помощью boolean ответ.хорошо

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

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

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

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

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

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

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

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

Чтобы получить содержимое 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

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

Благодаря этому метод read() может быть использован с urllib но не с requests.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top