Руководство для начинающих по HTTP-запросам Python

 
 

Все доступно в Интернете через запросы. Если вам нужна информация с веб-страницы в вашем приложении Python, вам нужен веб-запрос. В этой статье мы углубимся в запросы Python. Мы рассмотрим, как структурирован веб-запрос и как сделать запрос Python. К концу вы сможете использовать библиотеку запросов Python, которая упрощает весь процесс.

Введение в HTTP-запросы
Для обмена данными в Интернете нам в первую очередь нужен протокол связи. Протокол, используемый при просмотре веб-страниц, — это протокол передачи гипертекста, или HTTP. HTTP использует TCP в качестве транспортного протокола, потому что ему нужен надежный транспорт, и только TCP может это гарантировать.

Допустим, нам нужен ресурс — такая HTML-страница на веб-сервере, расположенном где-то в мире. Мы хотим получить доступ к этому ресурсу или, другими словами, мы хотим просмотреть эту страницу в нашем веб-браузере. Первое, что нам нужно сделать, это сделать HTTP-запрос. HTTP — это протокол клиент-сервер, что означает, что запросы инициируются клиентом.

Получив запросы, сервер обрабатывает их и возвращает соответствующий ответ.

Сервер может ответить по-разному. Он может отправить запрошенный нами ресурс или ответить кодами состояния, если что-то пойдет не так, как ожидалось.

В каждом протоколе связи информация должна быть в определенных полях. Это потому, что и клиент, и сервер должны знать, как интерпретировать запрос или ответ. В следующих разделах мы рассмотрим, как создаются HTTP-запрос и HTTP-ответ. Мы также обсудим роль наиболее важных полей.

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

Действительный HTTP-запрос должен содержать следующие элементы:

HTTP-метод, например GETилиPOST
версия протокола HTTP
путь ресурса для извлечения
Затем мы также можем добавить некоторые необязательные заголовки, которые указывают дополнительную информацию об отправителе или сообщении. Одним из примеров общего заголовка HTTP-запроса является User-Agentили естественный язык, который предпочитает клиент. Оба этих необязательных заголовка предоставляют информацию о клиенте, который делает запрос.

Это пример HTTP-сообщения, и мы можем ясно понять все указанные поля:

~~~http
GET / HTTP/1.1
Host: www.google.com
Accept-Language: en-GB, en; q=0.5
~~~
В первой строке указывается тип запроса и версия протокола HTTP. Затем мы указываем Hostи язык, принятый клиентом, отправляющим запрос. Обычно сообщения намного длиннее, но это дает представление о том, как они выглядят.

HTTP-ответ
Теперь, когда у нас есть представление о том, как выглядит HTTP-запрос, мы можем продолжить и посмотреть HTTP-ответ.

Ответ HTTP обычно содержит следующие элементы:

версия протокола HTTP
код состояния с описательным коротким сообщением
список заголовков HTTP
тело сообщения, содержащее запрошенный ресурс
Теперь, когда мы представили основные элементы, которые вам нужны, стоит подвести итоги, прежде чем переходить к следующему шагу. К настоящему времени должно быть ясно, что всякий раз, когда клиент хочет связаться с HTTP-сервером, он должен создать и отправить HTTP-запрос. Затем, когда сервер получает его, он создает и отправляет ответ HTTP.

Наконец-то мы готовы представить библиотеку запросов Python.

Библиотека запросов Python
Библиотека запросов Python позволяет отправлять HTTP-запросы Python — от простых до сложных. Библиотека запросов Python абстрагируется от сложности создания сложных запросов Python, предоставляя простой в использовании интерфейс. В следующих разделах мы увидим, как создавать простые запросы Python и интерпретировать ответ. Мы также увидим некоторые функции, предоставляемые библиотекой запросов Python.

Установка запросов Python
Во-первых, нам нужно установить библиотеку запросов Python. Давайте установим его, используя pip:

$ pip install requests
После правильной установки библиотеки запросов Python мы можем начать ее использовать.

Наш первый GET-запрос с Python-запросами
Первое, что нам нужно сделать, это создать файл Python. В этом примере мы называем это web.py. Внутри этого исходного файла вставьте этот код:

import requests

URL = «https: //www.google.com»
resp = requests.get (URL)

print (resp)
Эта программа делает запрос GET для Google. Если мы запустим эту программу, мы, вероятно, получим такой вывод:

$ python web.py
<Response [200]>
Итак, что это значит?

Мы говорили о коде состояния ранее. Этот вывод говорит нам, что наш запрос был получен, понят и успешно обработан. Существуют и другие коды, и мы можем перечислить несколько наиболее распространенных:

301 Moved Permanently. Это сообщение о перенаправлении. URL-адрес ресурса, который мы искали, был перемещен. Новый URL приходит с ответом.

401 Unauthorized. Это указывает на ответ об ошибке клиента. В этом случае сервер сообщает нам, что мы должны пройти аутентификацию, прежде чем продолжить запрос.

404 Not found. Это также указывает на ответ об ошибке клиента. В частности, это означает, что сервер не может найти ресурс, который мы искали.

Что, если мы хотим условно проверить статус и предоставить различные действия на основе кода статуса? Ну, мы можем легко сделать это:

import requests

URL = «https: //www.google.com/blah»
resp = requests.get (URL)

if resp.status_code == 200:
print («Okay, all good!»)
elif resp.status_code == 301:
print («Ops, the resource has been moved!»)
elif resp.status_code == 404:
print («Oh no, the resource wasn’t found!»)
else:
print (resp.status_code)
Если мы запустим скрипт сейчас, мы получим что-то другое. Попробуйте и посмотрите, что у нас получится. 😉

Если нам также нужно описательное короткое сообщение, которое приходит с каждым кодом состояния, мы можем использовать resp.reason. В случае кода состояния 200 мы просто получим OK.

Проверка ответа на запрос Python
На данный момент мы знаем, как сделать базовый запрос Python. После запроса нам нужен ответ, верно?

В предыдущем разделе мы видели, как получить код состояния ответа. Теперь мы хотим прочитать тело ответа, которое является запрошенным нами фактическим ресурсом. Для этого нам нужно использовать resp.content. Допустим, мы ищем домашнюю страницу Google.

Вот что мы получаем при запуске скрипта:

b’<! doctype html><html itemscope=»» itemtype=«http: //schema.org/WebPage» lang="en"><head><meta content="text/html; [... ]
Я добавил [... ]выше, потому что получаемый нами ресурс — text/htmlдокумент — слишком длинный для печати. Насколько? Мы можем использовать len (resp.content) для получения этой информации. В приведенном выше случае это было 13931 байт — определенно слишком много, чтобы печатать здесь!

Использование API
Одна из причин, по которой библиотека запросов Python стала такой популярной, заключается в том, что она очень упрощает взаимодействие с API. В этом примере мы будем использовать простой API для предсказания возраста человека по его имени. Этот API называется Agify.

Это код для примера:

import requests
import json

URL = «https: //api.agify.io/? name=Marcus»
resp = requests.get (URL)

if resp.status_code == 200:
encoded = resp.json ()
print (encoded['age’])
else:
print (resp.status_code)
В данном случае мы хотим узнать возраст человека по имени Маркус. Получив ответ, если код состояния равен 200, мы интерпретируем результат в формате JSON, используя resp.json (). На данный момент у нас есть объект, похожий на словарь, и мы можем распечатать предполагаемый возраст.

Предположительный возраст Маркуса — 41годы.

Настройка заголовков
Заголовки HTTP предоставляют дополнительную информацию обеим сторонам HTTP-разговора. В следующем примере мы увидим, как мы можем изменить заголовки HTTP-запроса GET. В частности, мы изменим заголовки User-Agentи. Accept-LanguageСообщает User-Agentсерверу некоторую информацию о приложении, операционной системе и поставщике запрашивающего агента. Заголовок Accept-Languageсообщает, какие языки клиент может понять.

Это наш простой фрагмент кода:

import requests

URL = «https: //www.google.com»
custom_headers = {'Accept-Language’: 'fr-CH, fr; q=0.9, en; q=0.8, de; q=0.7, *; q=0.5', 'User-Agent’: 'Mozilla/5.0 (Linux; Android 12; SM-S906N Build/QP1A. 190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.119 Mobile Safari/537.36'}
resp = requests.get (URL, headers=custom_headers)

if resp.status_code == 200:
# handle the response
print (resp.content[:100]) 
else:
print (resp.status_code)
Если все пойдет правильно, вы должны получить что-то вроде этого:

$ <! doctype html><html lang=»fr"><head><meta charset="UTF-8"><meta content="width=device-width, mini [... ]
В этом примере мы изменили User-Agent, притворившись, что наш запрос исходит от Mozilla Firefox. Мы также говорим, что наша операционная система — Android 12, а наше устройство — Samsung Galaxy S22.

Поскольку мы напечатали первые 100 символов приведенного выше ответа, мы видим, что полученная HTML-страница написана на французском языке.

Распродажа $3/месяц
Вывод
В этой статье мы рассказали о протоколе HTTP с кратким теоретическим введением. Затем мы рассмотрели библиотеку запросов Python. Мы увидели, как писать базовые HTTP-запросы Python и как настраивать их в соответствии с нашими потребностями.

Я надеюсь, что вы найдете эту библиотеку и эту статью полезными для своих проектов.

3D-печать5GABC-анализAndroidAppleAppStoreAsusCall-центрCRMDellDNSDrupalFacebookFMCGGoogleHuaweiInstagramiPhoneLinkedInLinuxMagentoMicrosoftNvidiaOpenCartPlayStationPOS материалPPC-специалистRuTubeSamsungSEO-услугиSMMSnapchatSonyStarlinkTikTokTwitterUbuntuUp-saleViasatVPNWhatsAppWindowsWordPressXiaomiYouTubeZoomАвдеевкаАктивные продажиАкцияАлександровск ЛНРАлмазнаяАлчевскАмвросиевкаАнализ конкурентовАнализ продажАнтимерчандайзингАнтрацитАртемовскАртемовск ЛНРАссортиментная политикаБелгородБелицкоеБелозерскоеБердянскБизнес-идеи (стартапы)БрендБрянкаБукингВахрушевоВендорВикипедияВирусная рекламаВирусный маркетингВладивостокВнутренние продажиВнутренний маркетингВолгоградВолновахаВоронежГорловкаГорнякГорскоеДебальцевоДебиторкаДебиторская задолженностьДезинтермедитацияДзержинскДивизионная система управленияДизайнДимитровДирект-маркетингДисконтДистрибьюторДистрибьюцияДобропольеДокучаевскДоменДружковкаЕкатеринбургЕнакиевоЖдановкаЗапорожьеЗимогорьеЗолотоеЗоринскЗугрэсИжевскИловайскИрминоКазаньКалининградКировскКировскоеКомсомольскоеКонстантиновкаКонтент-маркетингКонтент-планКопирайтингКраматорскКрасноармейскКрасногоровкаКраснодарКраснодонКраснопартизанскКрасный ЛиманКрасный ЛучКременнаяКураховоКурскЛисичанскЛуганскЛутугиноМакеевкаМариупольМаркетингМаркетинговая информацияМаркетинговые исследованияМаркетинговый каналМаркетинг услугМаркетологМарьинкаМедиаМелекиноМелитопольМенеджментМерчандайзерМерчандайзингМиусинскМолодогвардейскМоскваМоспиноНижний НовгородНиколаевНиколаевкаНишевой маркетингНовоазовскНовогродовкаНоводружескНовосибирскНумерическая дистрибьюцияОдессаОмскОтдел маркетингаПартизанский маркетингПервомайскПеревальскПетровскоеПопаснаяПравило ПаретоПривольеПрогнозирование продажПродвижение сайтов в ДонецкеПромоПромоушнПрямой маркетингРабота для маркетологаРабота для студентаРазработка приложенийРаспродажаРегиональные продажиРекламаРеклама на асфальтеРемаркетингРетро-бонусРибейтРитейлРовенькиРодинскоеРостов-на-ДонуРубежноеСамараСанкт-ПетербургСаратовСватовоСвердловскСветлодарскСвятогорскСевастопольСеверодонецкСеверскСедовоСейлз промоушнСелидовоСимферопольСинергияСколковоСлавянскСнежноеСоздание сайтов в ДонецкеСоледарСоциальные сетиСочиСтаробельскСтаробешевоСтахановСтимулирование сбытаСуходольскСчастьеТелемаркетингТельмановоТираспольТорговый представительТорезТрейд маркетингТрейд промоушнТюменьУглегорскУгледарУкраинскХабаровскХарцызскХерсонХостингЦелевая аудиторияЧасов ЯрЧелябинскШахтерскЮжно-СахалинскЮнокоммунаровскЯндексЯсиноватая