2010-01-07 7 views
498

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

+8

Не бросить еще один ключ в ваших планах, но если вы говорите об использовании их для доступа к HTTP Я рекомендую http://code.google.com/p/httplib2/(httplib2). –

+58

[Запросы] (http://docs.python-requests.org/en/latest/index.html) является лучшим. – Yarin

+1

Да, используйте запросы. http://stackoverflow.com/questions/22676/how-do-i-download-a-file-over-http-using-python/10744565#10744565 – hughdbrown

ответ

511

Я знаю его уже было сказано, но я настоятельно рекомендую пакет предлагает питона: 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
  • потокобезопасна.
+25

Я выбрал это как ответ, потому что исходный ответ ушел несвежий. Поэтому, если вам интересно, почему этот ответ опережает ответ с 76 upvotes, это потому, что Requests - это новый способ дефактовать. –

+71

@PaulBiggar вы говорите, что это лучший ответ. Но на этот вопрос он не отвечает. Я пришел сюда, чтобы узнать о различиях между urllib и urllib2. Особенно о возможностях кодирования url. Ответ: используйте запросы! ;) Просто говорю, что вы, возможно, захотите прояснить вопрос. В его нынешнем виде ответ от Краста на самом деле действительно отвечает на вопрос. – exhuma

+1

@exhuma urllib2 пытается еще больше абстрагировать запросы url с классом urllib2.Request, но не хватает нескольких общих утилит, поэтому он часто используется вместе с urllib и отвечает на ваш конкретный вопрос: он не имеет функций кодирования url, поскольку param для кодирования вы должны использовать urllib.urlencode(), для строковой кодировки с использованием url вы должны использовать urllib.quote()/quote_plus(). Запросы заботятся обо всем этом для вас: просто добавьте unencoded/un-safe строки в params dict; который является частью причины, по которой большинство питонов говорят, что это лучшая альтернатива. – Hutch

5

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

+2

То, что вы сказали об appengine, не совсем верно. Фактически вы можете использовать httplib, urllib и urllib2 в App Engine (они являются обертками для получения URL-адреса, сделанные так, что больше кода будет совместимо с appengine.) – Crast

+0

Ах, должно быть, новое. Мой код завершился неудачно, я пробовал и должен был быть перезаписан для работы с fetch ... –

+0

https://devsite.googleplex.com/appengine/docs/python/urlfetch/overview#Fetching_URLs_in_Python – allyourcode

173

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.

+1

Как кто-то создает URL-адрес с закодированным строка запроса с использованием urllib2? Это единственная причина, по которой я использую urllib, и я хотел бы убедиться, что я делаю все самое последнее/самое лучшее. – Gattster

+2

Как и в моем примере выше, вы используете 'urlopen()' и 'Request' из * urllib2 *, и вы используете' urlencode() 'from * urllib *. Нет никакого реального вреда в использовании обеих библиотек, если вы убедитесь, что используете правильный urlopen. Документы [urllib docs] [1] понятны, что использование этого метода является используемым. [1]: http://docs.python.org/library/urllib2.html#urllib2.urlopen – Crast

+0

Я использовал [это] (https://gist.github.com/vgoklani/1811970) gist для 'urllib2 .urlopen'; также содержит другие варианты. –

9

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

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

Просто обратите внимание, будьте осторожны с urlencode, так как он не может обрабатывать объекты напрямую - вы должны закодировать их перед отправкой их в urlencode (u'blá'.encode ('utf-8') или что-то еще). – 2011-06-27 02:12:51

+0

@ user18015: Я не думаю, что это относится к Python 3, вы можете уточнить? –

+0

Как я уже отмечал выше, этот вопрос и различные ответы должны быть обновлены, чтобы уточнить, что «urllib» в Python 3 - еще один вариант, очищенный различными способами. Но, к счастью, официальная документация также отмечает, что «пакет« Запросы »рекомендуется для HTTP-клиентского интерфейса более высокого уровня.» В [21.6. urllib.request - Расширяемая библиотека для открытия URL-адресов - Документация Python 3.6.3] (https://docs.python.org/3/library/urllib.request.html) – nealmcb

6

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

21

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/

1

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

1

Чтобы получить содержимое 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) возвращает requests.models.Response

 Смежные вопросы

  • Нет связанных вопросов^_^