Каковы различия между модулем urllib, urllib2 и requests?
в 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-адресов 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()возвращает ahttp.client.HTTPResponse- Python3
urllib.urlopen(url)возвращаетinstance- запрос
request.get(url)возвращает arequests.models.Response
Comments