Первый запрос
requests — самая популярная библиотека Python для работы с интернетом: скачать страницу, спросить API о погоде или курсе валют, отправить данные на сервер. Ставится командой py -m pip install requests.
Первый запрос
import requests
r = requests.get("https://api.github.com/users/torvalds", timeout=5)
print(r.status_code) # 200
print(r.headers["Content-Type"])
print(r.text[:100]) # тело ответа строкой
requests.get отправляет HTTP-запрос GET и возвращает объект Response. Самое важное в нём:
| Поле | Что это |
|---|---|
r.status_code |
код ответа: 200, 404, 500… |
r.ok |
True, если код меньше 400 |
r.text |
тело ответа строкой |
r.json() |
тело, разобранное из JSON в словари и списки |
r.headers |
заголовки ответа (как словарь, регистр не важен) |
r.content |
тело байтами — для картинок и файлов |
Всегда указывайте timeout — сколько секунд ждать ответа. Без него программа может зависнуть навсегда, если сервер молчит.
Коды ответа
| Код | Значит |
|---|---|
| 200 OK, 201 Created, 204 No Content | успех |
| 301, 302 | перенаправление (requests сам идёт по новому адресу) |
| 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests | ошибка запроса — «виноват клиент» |
| 500, 502, 503 | ошибка на сервере |
Важно: ответ 404 или 500 — не исключение. requests честно возвращает Response с этим кодом, и проверять его нужно самому:
r = requests.get(url, timeout=5)
if not r.ok:
print("Ошибка", r.status_code)
Или одной строкой: r.raise_for_status() бросит requests.HTTPError, если код 400 и больше.
JSON
Большинство API отвечают в формате JSON. r.json() превращает его в обычные объекты Python:
user = requests.get("https://api.github.com/users/torvalds", timeout=5).json()
print(user["name"], user["public_repos"])
repos = requests.get("https://api.github.com/users/torvalds/repos", timeout=5).json()
best = max(repos, key=lambda r: r["stargazers_count"])
print(best["name"])
Объект JSON → dict, массив → list, true/false/null → True/False/None.
Курс валют ЦБ
Сайт cbr-xml-daily.ru бесплатно отдаёт официальные курсы ЦБ РФ:
data = requests.get("https://www.cbr-xml-daily.ru/daily_json.js", timeout=5).json()
usd = data["Valute"]["USD"]
print(usd["Value"] / usd["Nominal"]) # рублей за 1 доллар
Обратите внимание на Nominal: курс некоторых валют дан не за одну единицу, а за 10, 100 или 10 000 (иена, тенге, вьетнамский донг). Курс за одну единицу — Value / Nominal.
Как проверяются задачи курса
Задачи не ходят в настоящий интернет: проверка поднимает у вас на компьютере маленький сервер (127.0.0.1), который отвечает так же, как настоящий API. Так результат не зависит от сети и от того, какой сегодня курс. А кнопка «Запустить у себя» выполняет блок if __name__ == "__main__" — там программа обращается к живым сайтам.
Итог
requests.get(url, timeout=5)→ Response;status_code,ok,text,json(),headers;- 404 и 500 — не исключения: проверяйте
r.okили вызывайтеraise_for_status(); - у курсов ЦБ учитывайте
Nominal.