Рубрики
Без рубрики

Python HTTP в Lightspeed ⚡ Часть 2: Urllib3 и запросы

В моем предыдущем посте я охватил, как использовать базовый HTTP-модуль. Теперь давайте пойдем на более высокий уровень и че … Помечено Python, HTTP, Учебник, CodeNewie.

Python-http (2 часть серии)

В моем предыдущем посте я охватил, как использовать основные http . модуль. Теперь давайте пойдем на более высокий уровень и проверьте, как использовать Urllib3. Тогда мы достигнем еще более высоких горизонтов, узнав о запросах. Но во-первых, быстрое распознавание Урлиба и Урлиб3.

Бросок

Однажды, обратно, когда люди качали Python 2, у вас были эти библиотеки под названием httplib и urllib2. Тогда Python 3 произошел.

В Python 3 httplib был повторно поклонен к http.ciclient, который вы узнали о части 1, и Urllib2 был разделен на несколько погруженных в новом модуле, называемом Urllib. Urllib2 и Urllib содержали интерфейс HTTP-интерфейса высокого уровня, который не потребовал, чтобы вы беспокоились с деталями http.client (ранее httplib). За исключением того, что этот новый URLLIB отсутствует длинный список критических функций, таких как:

  • Безопасность потоков
  • Объединение соединения
  • Клиентская сторона SSL/TLS проверка
  • Загрузка файлов с мультипартатовой кодировкой
  • Помощники для повторных попыток запросов и динамики с HTTP Redirets
  • Поддержка GZIP и Deflate кодирования
  • Поддержка прокси для HTTP и носков

Для решения этих вопросов URLLIB3 был создан сообществом. Это не основной модуль Python (и, вероятно, никогда не будет), но ему не нужно поддерживать совместимость с Urllib.

Urllib здесь не будет покрыт здесь, потому что Urllib3 может сделать почти все, что он делает и имеет некоторые дополнительные функции, а подавляющее большинство программистов используют Urllib3 и запросы.

Так что теперь, когда вы знаете разницу между Urllib и Urllib3, вот пример Urllib (единственный здесь), который использует http.cookiejar. Cookiejar класс от части 1:

>>> import urllib.request
>>> import http.cookiejar
>>> policy = http.cookiejar.DefaultCookiePolicy(
...     blocked_domains=["ads.net", ".ads.net"])
>>> cj = http.cookiejar.CookieJar(policy)
>>> opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
>>> r = opener.open("http://example.com")
>>> str(type(r))
""

Установка

Ни Urllib3, ни запросы не включены в установку Python по умолчанию (если ваш Python был упакован на распределение, то они могут быть там). Таким образом, они должны быть установлены с PIP. PIP3 Установите 'urllib3 [Безопасные, носки] Запросы [Носки]' Должна установить их для вас. Безопасный Часть устанавливает пакеты, связанные с сертификатами, которые нуждаются в URLLIB3 и Носки Устанавливает пакеты, связанные с протоколом носки.

Urllib3.

Очевидно, вы должны сначала импортировать его с помощью Импорт Urllib3 И для тех из вас, кто читал часть 1, вот где все интересны. Вместо того, чтобы создать соединение напрямую, вы создаете PoolManager объект. Это обрабатывает объединение соединения и безопасность потоков для вас. Есть также ProxyManager Объект для маршрутизации запросов через прокси HTTP/HTTPS, а также Socksproxymanager Для SOCKS4 и SOCKS5 прокси. Вот как это выглядит:

>>> import urllib3
>>> from urllib3.contrib.socks import SOCKSProxyManager
>>> proxy = urllib3.ProxyManager('http://localhost:3128/')
>>> proxy.request('GET', 'http://google.com/')
>>> proxy = SOCKSProxyManager('socks5://localhost:8889/')

Помните, что HTTPS Proxies не может подключиться к сайтам HTTP.

У Urllib3 также есть регистратор, который будет регистрировать много сообщений. Вы можете настроить добросовестность, импортируя модуль регистратора и вызов logging.getLogger («Urllib3»). Setlevel (your_level) Отказ

Как Httpconnection в http . Модуль, Urllib3 имеет Запрос () метод. Это вызывается как poolmanager.request ('Get', 'http://httpbin.org/robots.txt') Отказ Похоже на http. Этот метод также возвращает класс по имени Httpresponse Отказ Но не обманывайся! Это не http.client. Httpresponse Отказ Это Urllib3.response. Httpresponse Отказ Версия Urllib3 имеет некоторые методы, которые не определены в http . И они окажутся как очень полезными и удобными.

Как объяснил это Запрос () Метод возвращает Httpresponse объект. У него есть данные Участник, который представляет содержимое ответа в строке JSON (закодировано как байты UTF-8). Чтобы осмотреть его, вы можете использовать:

import json
print(json.loads(response.data.decode('utf-8'))

Создание параметра запроса

Параметр запроса выглядит как http://httpbin.org/get?arg=value Отказ Самый простой способ построить что-то вроде этого, состоит в том, чтобы строка, содержащая все, включая значок вопроса, а затем пройти пары аргумента/значения в качестве словаря на URLLIB.PARSE.URLENCODE () (Да, Urllib ) и объединяйте это на вашу оригинальную строку.

Вот раунд. Каждый параметр в этой таблице, который можно указать, должен быть словарь. В ответе будет несколько клавиш JSON, содержащие некоторые из них:

“источник” N / A.
“Заголовки” заголовки
“args” Поля (голова / Get / Delete)
“args” Кодированный URL-параметр (запись / put)
“форма” поля (пост / поставлено)
“JSON” Кодированное тело с приложением типа контента / JSON в заголовках
«Файлы» ‘filefield’: (file_name, file_data, mime_type) в следующих полях
“данные” Двоичные данные в теле с любым типом содержимого в заголовках параметра

Https в Urllib3.

Существует некоторая дополнительная котел для добавления к использованию сертификатов и, следовательно, HTTPS в A PoolManager , но обладает преимуществом бросать ошибку, если соединение не может быть закреплено по какой-то причине:

>>> import certifi
>>> import urllib3
>>> pool = urllib3.PoolManager(
...     cert_reqs='CERT_REQUIRED',
...     ca_certs=certifi.where())
>>> pool.request('GET', 'https://google.com')
(No exception)
>>> pool.request('GET', 'https://expired.badssl.com')
(Throws urllib3.exceptions.SSLError)

Некоторые дополнительные вкусности

Похоже на http. , Urllib3 Соединения поддерживают тайм-ауты для запросов. Для еще большего контроля вы можете сделать Тайм-аут Объект, чтобы указать отдельные подключения и прочитанные тайм-ауты (Все исключения устареют под Urllib3.exceptions ):

>>> pool.request(
...     'GET', 'http://httpbin.org/delay/3', timeout=2.5)
MaxRetryError caused by ReadTimeoutError
>>> pool.request(
...     'GET',
...     'http://httpbin.org/delay/3',
...     timeout=urllib3.Timeout(connect=1.0))

>>> pool.request(
...     'GET',
...     'http://httpbin.org/delay/3',
...     timeout=urllib3.Timeout(connect=1.0, read=2.0))
MaxRetryError caused by ReadTimeoutError

Что-то, что http . Нет, не повторяется запросы. Urllib3 имеет это в силу, будучи библиотекой высокого уровня. Его Документация не мог объяснить это лучше:

Urllib3 может автоматически повторить запросы IDEMPOTENT. Этот же механизм также обрабатывает перенаправления. Вы можете управлять повторными попытками с использованием параметра Retries для запроса (). По умолчанию Urllib3 будет повторяться запросы 3 раза и выполнять до 3 перенаправлений.

Чтобы изменить количество повторных попыток, просто укажите целое число:

>>> pool.requests('GET', 'http://httpbin.org/ip', retries=10)

Чтобы отключить все повторные и перенаправить логику Укажите:

>>> pool.request(
...     'GET', 'http://nxdomain.example.com', retries=False)
NewConnectionError
>>> r = pool.request(
...     'GET', 'http://httpbin.org/redirect/1', retries=False)
>>> r.status
302

Чтобы отключить перенаправления, но укажите логику повторной группе, укажите:

>>> r = pool.request(
...     'GET', 'http://httpbin.org/redirect/1', redirect=False)
>>> r.status
302

Похоже на Тайм-аут , есть также Повторите попытку Объект для установки максимальных повторных попыток и перенаправляющих отдельно. Это сделано так: Retries = Urllib3.retry (3,) Отказ Запрос бросит MaxretryError Если слишком много запросов сделаны.

Вместо того, чтобы пройти Повторите попытку Объект для каждого запроса, вы также можете указать Повторите попытку объект в PoolManager Конструктор, чтобы сделать его применять ко всем запросам. То же самое относится и к Тайм-аут Отказ

Запросы

Запросы используют URLLIB3 под капотом и делает его еще более простым, чтобы сделать запросы и получать данные. Для одной вещи сохраняют 100% автоматические, по сравнению с Urllib3, где это не так. Он также имеет крюки событий, которые вызывают функцию обратного вызова, когда срабатывает событие, как приема ответа (но это расширенная функция, и она не будет покрыта здесь).

В запросах каждый тип запроса имеет свою собственную функцию. Поэтому вместо создания соединения или пула вы напрямую получаете (например) URL. Многие параметры ключевых слов, используемые в URLLIB3 (показанном на приведенной выше таблице), также могут быть использованы для просьбы одинаково. Все исключения источны под requests.exceptions Отказ

import requests
r = requests.get('https://httpbin.org/get')
r = requests.post('https://httpbin.org/post', data={'key':'value'})
r = requests.put('https://httpbin.org/put', data={'key':'value'})
r = requests.delete('https://httpbin.org/delete')
r = requests.head('https://httpbin.org/get')
r = requests.options('https://httpbin.org/get')
# You can disable redirects if you want
r = requests.options('https://httpbin.org/get', allow_redirects=False)
# Or set a timeout for the number of seconds a server has to start responding
r = requests.options('https://httpbin.org/get', timeout=0.001)
# Set the connect and read timeouts at the same time
r = requests.options('https://httpbin.org/get', timeout=(3.05, 27))
# To pass query parameters (`None` keys won't be added to the request):
r = requests.get('https://httpbin.org/get',
    params={'key1': 'value1', 'key2': 'value2'})
# If a key has a list value a key/value pair is added for each value in the list:
r = requests.get('https://httpbin.org/get',
    params={'key1': 'value1', 'key2': ['value2', 'value3']})
# Headers can also be added:
r = requests.get('https://httpbin.org/get',
    headers={'user-agent': 'my-app/0.0.1'})
# And, only in requests (not urllib3), there is a cookies keyword argument.
r = requests.get('https://httpbin.org/get',
    cookies=dict(cookies_are='working'))

Значение, возвращенное из этих вызовов, является еще одним типом объекта ответа. На этот раз это Запросы. Ответ (по крайней мере, это не было другого httpresponse 🙂). Этот объект имеет множество информации, такую как время запроса взяла, JSON от ответа, была ли страница перенаправлена и даже ее Cookiejar тип. Вот бегущий список наиболее полезных членов:

  • r.status_code и r.reason : Числовый код состояния и людской причина.
  • URL : Канонический URL используемый в запросе.
  • текст : Текст извлечен по запросу.
  • Содержание : Байта версия текст Отказ
  • JSON () : Попытки вернуть JSON текст Отказ Поднимает ValueError. Если это невозможно.
  • кодирование : Если вы знаете правильное кодирование для текст Установите это здесь так текст можно прочитать правильно.
  • очевидный_encoding : Кодирование, которые угадали, что это было.
  • ROING_FOR_STATUS () : Поднимает requests.exceptions. Httperror. Если запрос столкнулся с одним.
  • Хорошо : Правда, если status_code меньше 400, ложь иначе.
  • iS_redirect и IS_PERMANENT_REDIRECT. : Был ли код состояния перенаправленным или если он был постоянным перенаправлением, соответственно.
  • Заголовки : Заголовки в ответ.
  • Печенье : Печенье в ответ.
  • История Все объекты ответа от URL-адресов, которые перенаправлены, чтобы добраться до настоящего URL, отсортированы от старейших до новейших.

Вот как вы сохранили выходной сигнал в файл:

with open(filename, 'wb') as fd:
    for chunk in r.iter_content(chunk_size=128):
        fd.write(chunk)

И именно то, как вы ругаетесь загрузки, не прочитав весь файл:

with open('massive-body', 'rb') as f:
    requests.post('http://some.url/streamed', data=f)

В случае ошибки сети запросы будут поднимать ConnectionError Отказ Если время ожидания запроса истек, он поднимает Тайм-аут Отказ И если были сделаны слишком много перенаправлений, он поднимает Томановедиеры Отказ

Прокси

HTTP, HTTPS и носки прокси поддерживаются. Запросы также чувствительны к Http_proxy и Https_proxy Переменные среды и, если они установлены, запросы будут использовать эти значения в качестве прокси автоматически. В Python вы можете установить прокси, чтобы использовать в параметре:

# Instead of socks5 you could use http and https.
proxies = {
    'http': 'socks5://user:pass@host:port',
    'https': 'socks5://user:pass@host:port'
}
requests.get('http://example.org', proxies=proxies)

Объекты сеанса

А Сессия Может упорствовать печенье и некоторые параметры через запросы и повторно используют базовое HTTP-соединение для запросов. Он использует Urllib3 PoolManager , что значительно увеличит производительность HTTP-запросов на тот же хост. Он также имеет все методы основных запросов API (все методы запросов, которые вы видели выше). Они также могут быть использованы в качестве контекстных менеджеров:

with requests.Session() as s:
    s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')

И были сделаны

Это завершает серию HTTP Python. Здесь ошибки? Дайте мне знать, чтобы я мог их исправить.

Python-http (2 часть серии)

Оригинал: “https://dev.to/zenulabidin/python-http-at-lightspeed-part-2-urllib3-and-requests-476”