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

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

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 Fetch 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.encode () для кодирования параметров перед их передачей.

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

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

например ссылка -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 на Питон3. 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() возвращает http.client.HTTPResponse
  • Питон3 urllib.urlopen(url) возвращает instance
  • запрос request.get(url) возвращает requests.models.Response