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



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

1209   9  

9 ответов:

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

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

во-первых, он поддерживает полностью спокойным 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 в стиле браузера
  • Базовая/Дайджест Аутентификация
  • Элегантный Ключ / Значение Cookies
  • Автоматическая Декомпрессионная
  • Unicode Тела Ответа
  • Загрузка Составных Файлов
  • подключение Тайм-ауты
  • .поддержки 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-адресов.

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

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

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

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

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

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

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

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

urllib2.urlоткрыть принимает экземпляр класса запрос или 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 инструмент автоматически сделает большую часть работы за вас.

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

просто чтобы добавить к существующим ответам, я не вижу, чтобы кто-то упоминал, что запросы python не являются родной библиотекой. Если вы в порядке с добавлением зависимостей, то запросы в порядке. Однако, если вы пытаетесь избежать добавления зависимостей, urllib-это собственная библиотека 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() возвращает a http.client.HTTPResponse
  • Python3 urllib.urlopen(url) возвращает instance
  • запрос request.get(url) возвращает a requests.models.Response

Comments

    Ничего не найдено.