Python Materials For Beginners
454 subscribers
39 photos
1 video
9 files
151 links
Download Telegram
🔶 Requests. Простий GET-запит.

У Python HTTP-запити можна робити вбудованою бібліотекою urllib.
Але значно зручніше використовувати сторонню бібліотеку requests. Варто також згадати інші бібліотеки зі схожим інтерфейсом — наприклад, httpx та curl_cffi. Вони можуть працювати асинхронно та мають більш наближені до браузерних TLS-відбитки, що зменшує ймовірність бану при скрапінгу.

import requests

response = requests.get("https://example.com/")
response.raise_for_status()

print(response.text)

with open("content.html", "wb") as file:
file.write(response.content)


Це простий приклад GET-запиту для отримання HTML-сторінки.
HTML-код виводиться в консоль як рядок і зберігається у файл у байтовому вигляді.

Для різних HTTP-методів є відповідні методи в requests. Додаткові дані можна передавати через аргументи методів (заголовки, параметри запиту, тіло, проксі тощо).

⚠️ Поширена помилка початківців — забути перевірити код відповіді сервера. Найпростіше це зробити викликом raise_for_status(), який підніме виняток, якщо код відповіді не в межах 200–399.
Але також можна перевіряти атрибут status_code.

#http #requests #GET
👍4
🔷 Requests. GET з параметрами та заголовками.

Для прикладу виконаємо запит до погодного API

https://api.open-meteo.com/v1/forecast?latitude=50.4501&longitude=30.5234&current_weather=True&timezone=Europe/Kyiv

import requests

url = "https://api.open-meteo.com/v1/forecast"

params = {
"latitude": 50.4501,
"longitude": 30.5234,
"current_weather": True,
"timezone": "Europe/Kyiv"
}

headers = {
"User-Agent": "my-script/1.0",
}

response = requests.get(url, params=params, headers=headers)
response.raise_for_status()

json_content = response.json()
current_weather = json_content["current_weather"]
print("Температура в Києві:", current_weather["temperature"])
print("Швидкість вітру:", current_weather["windspeed"])


Основні моменти:

1️⃣ Параметри запиту передаються у вигляді словника у метод, бібліотека кодує їх
2️⃣ Суто для демонстрації змінюємо заголовки запиту (User-Agent)
3️⃣ Об'єкт response має метод json який перетворює json-відповідь у python об'єкт (зазвичай словник)

#http #requests #GET
👍3
🔶 Requests. POST form-urlencoded

POST використовується для створення ресурсів або надсилання даних на сервер. Дані передаються у тілі запиту, а не у URL (як при GET).

Є різні типи POST-запитів:

🔺 application/x-www-form-urlencoded – дані форми кодуються у вигляді param1=value1&param2=value2
🔺 application/json – дані у вигляді json
🔺 multipart/form-data – форми з файлами.

Даний приклад демонструє передачу даних форми (form-urlencoded)
Бібліотека автоматично виставляє заголовок відповідно до типу:

Content-Type: application/x-www-form-urlencoded

Форми часто використовується для авторизації на сайтах: у даних передаються логін і пароль. Але у даному випадку ми передаємо текст і розмір картинки, а сайт повертає нам QR-код картинку.

import requests

url = "https://api.qrserver.com/v1/create-qr-code/"

data = {
"data": "Привіт світ!",
"size": "200x200"
}

response = requests.post(url, data=data)
response.raise_for_status()

with open("qr_code.png", "wb") as file:
file.write(response.content)

#http #requests #POST
👍2
🔷 Requests. POST application/json

POST/application-json використовується для надсилання json даних на сервер (REST API)

Замість параметру data треба використовувати параметр json
У цьому випадку бібліотека requests виставляє заголовок:

Content-Type: application/json

Реальне API мені не вдалось знайти тому використаємо для прикладу тестове API:
import requests

url = "https://jsonplaceholder.typicode.com/posts"

json_payload = {
"title": "foo",
"body": "bar",
"userId": 1
}

response = requests.post(url, json=json_payload)
response.raise_for_status()

print(response.status_code)
print(response.json())


201
{'title': 'foo', 'body': 'bar', 'userId': 1, 'id': 101}


⚠️ Зверніть увагу що статус кодом який повертається може бути 201, а не 200 що відповідає створенню ресурсу.

Основні статус коди

#http #requests #POST
👍1
🔶 Requests. POST multipart/form-data

multipart/form-data використовується у формах з надсилання файлів на сервер.
У цьому випадку бібліотека requests виставляє заголовок:

Content-Type: multipart/form-data; boundary=...

Для прикладу завантажимо наш qrcode з попереднього прикладу на файлообмінник.
Також будемо вдавати браузер Mozilla.

Для відправки файлів використовується словник files з вказанням:

1️⃣ назви файлу
2️⃣ самого файлу
3️⃣ типу файлу

import requests

with open("qr_code.png", "rb") as file:
url = "https://catbox.moe/user/api.php"

files = {
"fileToUpload": ("qr_code.png", file, "image/png"),
}
data = {
"reqtype": "fileupload",
"userhash": "",
}
headers = {
"User-Agent" : "Mozilla/5.0 "
"(Windows NT 10.0; Win64; x64; rv:142.0)"
"Gecko/20100101 Firefox/142.0"
}
r = requests.post(url, files=files, data=data, headers=headers)
r.raise_for_status()
print(r.text.strip()) # вивод url

https://files.catbox.moe/lmcc82.png


#http #requests #POST
👎1
🔷 Requests. Використання сесій.

У Python бібліотека requests дозволяє зручно працювати з HTTP-запитами. Якщо потрібно виконати кілька запитів до одного сайту — варто використовувати сесію.

Що дає використання сесії:

1️⃣ Автоматично підтримувати cookies між запитами.
2️⃣ Дозволяють повторно використовувати одні ті самі заголовки.
3️⃣ Використовують одне TCP-з’єднання для кількох запитів → запити виконуються швидше.

Приклад коду з використанням сесій:
import requests

url = "https://httpbin.org/headers"

with requests.Session() as session:
# Виставляємо заголовоки для всіх запитів у сесії
headers = {
"User-Agent" : "Mozilla/5.0 "
"(Windows NT 10.0; Win64; x64; rv:142.0)"
"Gecko/20100101 Firefox/142.0"
}
session.headers.update(headers)

r1 = session.get(url)
r1.raise_for_status()
print(r1.json())

r2 = session.get(url)
r2.raise_for_status()
print(r2.json())

#http #requests #session
👍1