В Python, в чем разница между модулями urllib
, urllib2
и requests
? Почему их три? Они, похоже, делают то же самое ...В чем разница между модулем urllib, urllib2 и запросов?
ответ
Я знаю его уже было сказано, но я настоятельно рекомендую пакет предлагает питона: http://docs.python-requests.org/en/latest/index.html
Если вы использовали другие, чем питона языков, вы, вероятно, думаете 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.нагрузки() не намного больше писать, но уверен, что это удобно):
resp.json()
Или, если ваши данные ответ только текст, используйте:
resp.text
Это только верхушка айсберг. Это список функций с сайта запросов:
- Международные домены и URL-
- Keep-Alive & Пулы соединений
- Sessions с Cookie Постоянство
- Browser стиле SSL Проверка
- Basic/Дайджест Аутентификация
- Элегантные ключи/ценности Печенья
- Автоматическая декомпрессия
- Unicode Ответные Органы
- Multipart Загрузки файлов
- Подключение Таймауты
- .netrc поддержки
- элемент списка
- Python 2,6-3,4
- потокобезопасна.
Я выбрал это как ответ, потому что исходный ответ ушел несвежий. Поэтому, если вам интересно, почему этот ответ опережает ответ с 76 upvotes, это потому, что Requests - это новый способ дефактовать. –
@PaulBiggar вы говорите, что это лучший ответ. Но на этот вопрос он не отвечает. Я пришел сюда, чтобы узнать о различиях между urllib и urllib2. Особенно о возможностях кодирования url. Ответ: используйте запросы! ;) Просто говорю, что вы, возможно, захотите прояснить вопрос. В его нынешнем виде ответ от Краста на самом деле действительно отвечает на вопрос. – exhuma
@exhuma urllib2 пытается еще больше абстрагировать запросы url с классом urllib2.Request, но не хватает нескольких общих утилит, поэтому он часто используется вместе с urllib и отвечает на ваш конкретный вопрос: он не имеет функций кодирования url, поскольку param для кодирования вы должны использовать urllib.urlencode(), для строковой кодировки с использованием url вы должны использовать urllib.quote()/quote_plus(). Запросы заботятся обо всем этом для вас: просто добавьте unencoded/un-safe строки в params dict; который является частью причины, по которой большинство питонов говорят, что это лучшая альтернатива. – Hutch
urllib2.urlopen принимает экземпляр класса Request или url, тогда как urllib.urlopen принимает только URL.
Аналогичное обсуждение состоялось здесь: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html
Вы должны вообще использовать urllib2, так как это делает вещи немного проще в разы, принимая запрос объекты, а также будет поднимать URLException об ошибках протокола. В Google App Engine вы тоже не можете использовать. Вы должны использовать URL Fetch API, который предоставляет Google в изолированной среде Python.
То, что вы сказали об appengine, не совсем верно. Фактически вы можете использовать httplib, urllib и urllib2 в App Engine (они являются обертками для получения URL-адреса, сделанные так, что больше кода будет совместимо с appengine.) – Crast
Ах, должно быть, новое. Мой код завершился неудачно, я пробовал и должен был быть перезаписан для работы с fetch ... –
https://devsite.googleplex.com/appengine/docs/python/urlfetch/overview#Fetching_URLs_in_Python – allyourcode
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 для некоторых функций утилиты.
Bonus ответ С помощью Google App Engine, вы можете использовать любой из HTTPLIB, URLLIB или urllib2, но все они являются просто обертками для URL Google, Fetch API. То есть вы по-прежнему подвергаетесь тем же ограничениям, что и порты, протоколы и длина разрешенного ответа. Однако вы можете использовать ядро библиотек, как вы ожидали бы для получения URL-адресов HTTP.
Как кто-то создает URL-адрес с закодированным строка запроса с использованием urllib2? Это единственная причина, по которой я использую urllib, и я хотел бы убедиться, что я делаю все самое последнее/самое лучшее. – Gattster
Как и в моем примере выше, вы используете 'urlopen()' и 'Request' из * urllib2 *, и вы используете' urlencode() 'from * urllib *. Нет никакого реального вреда в использовании обеих библиотек, если вы убедитесь, что используете правильный urlopen. Документы [urllib docs] [1] понятны, что использование этого метода является используемым. [1]: http://docs.python.org/library/urllib2.html#urllib2.urlopen – Crast
Я использовал [это] (https://gist.github.com/vgoklani/1811970) gist для 'urllib2 .urlopen'; также содержит другие варианты. –
Мне нравится urllib.urlencode
функция, и она не существует в urllib2
.
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
Просто обратите внимание, будьте осторожны с urlencode, так как он не может обрабатывать объекты
@ user18015: Я не думаю, что это относится к Python 3, вы можете уточнить? –
Как я уже отмечал выше, этот вопрос и различные ответы должны быть обновлены, чтобы уточнить, что «urllib» в Python 3 - еще один вариант, очищенный различными способами. Но, к счастью, официальная документация также отмечает, что «пакет« Запросы »рекомендуется для HTTP-клиентского интерфейса более высокого уровня.» В [21.6. urllib.request - Расширяемая библиотека для открытия URL-адресов - Документация Python 3.6.3] (https://docs.python.org/3/library/urllib.request.html) – nealmcb
Значительная разница заключается в переносе Python2 на Python3. urllib2 не существует для python3 и его методы переносятся на urllib. Итак, вы используете это сильно и хотите перейти на Python3 в будущем, подумайте об использовании urllib. Однако инструмент 2to3 автоматически выполнит большую часть работы для вас.
URLLIB и urllib2 являются модули Python, которые делают URL, связанные с запросом вещи, но предлагают различные функциональные возможности.
1) urllib2 может принимать объект Request для установки заголовков для запроса URL-адреса, urllib принимает только URL-адрес.
2) urllib предоставляет метод urlencode, который используется для генерации строк запроса GET, urllib2 не имеет такой функции. Это одна из причин, почему urllib часто используется вместе с urllib2.
Запросы - Запросы - это простая, простая в использовании библиотека HTTP, написанная на Python.
1) Python просит кодирует параметры автоматически, так что вы просто передать их как простые аргументы, в отличие от случая URLLIB, где вам нужно использовать метод urllib.encode() для кодирования параметров перед передачей их.
2) Он автоматически декодировал ответ в Юникоде.
3) Запросы также имеют гораздо более удобную обработку ошибок. Если ваша аутентификация не удалась, urllib2 поднимет urllib2.URLError, в то время как Requests вернет нормальный объект ответа, как и ожидалось.Все, что вы должны видеть, если запрос был успешным булевой response.ok
Например, ссылки - https://dancallahan.info/journal/python-requests/
Просто, чтобы добавить к существующим ответам, я не вижу никого упоминать, что запросы питона не родной библиотеки. Если вы согласны с добавлением зависимостей, тогда запросы будут прекрасными. Однако, если вы пытаетесь избежать добавления зависимостей, 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)
возвращаетrequests.models.Response
Не бросить еще один ключ в ваших планах, но если вы говорите об использовании их для доступа к HTTP Я рекомендую http://code.google.com/p/httplib2/(httplib2). –
[Запросы] (http://docs.python-requests.org/en/latest/index.html) является лучшим. – Yarin
Да, используйте запросы. http://stackoverflow.com/questions/22676/how-do-i-download-a-file-over-http-using-python/10744565#10744565 – hughdbrown