</>
Тема 2 из 6

Первый запрос

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.