К содержимому

Документация

Python SDK: HttpClient: запросы к сайту

Получите клиент через ctx.http(). Запросы проходят через настройки сайта, прокси, ограничения и журнал. Методы отправки запросов синхронны.

Примеры являются фрагментами тела def run(ctx):. Все методы SDK синхронны, await не нужен.

Методы

with_headers

ctx.http().with_headers(headers) -> HttpClient

Аргумент Тип Обязателен Назначение
headers dict[str, str] Да Словарь HTTP-заголовков.

Результат: HttpClient. Объект SDK: используйте его методы, не передавайте целиком в emit.

Получить копию клиента с дополнительными HTTP-заголовками. Исходный клиент не меняется.

result = ctx.http().with_headers({'Accept': 'application/json'})

without_cache

ctx.http().without_cache() -> HttpClient

Аргументы не нужны.

Результат: HttpClient. Объект SDK: используйте его методы, не передавайте целиком в emit.

Получить копию клиента, которая запрашивает свежие ответы без чтения кэша.

result = ctx.http().without_cache()

get

ctx.http().get(url, auto_captcha=True) -> Response

Аргумент Тип Обязателен Назначение
url str Да Разрешённый HTTP(S)-адрес источника.

Результат: Response. Объект SDK: используйте его методы, не передавайте целиком в emit.

Загрузить страницу или JSON по URL методом GET.

result = ctx.http().get(ctx.param('catalog_url', 'https://example.com/catalog'))

post

ctx.http().post(url, body=None, auto_captcha=True) -> Response

Аргумент Тип Обязателен Назначение
url str Да Разрешённый HTTP(S)-адрес источника.
body str | dict | None Нет, default в сигнатуре Тело HTTP-запроса; для JSON передайте сериализованную строку.

Результат: Response. Объект SDK: используйте его методы, не передавайте целиком в emit.

Отправить POST с телом. Для точного JSON явно сериализуйте тело и укажите Content-Type.

import json
client = ctx.http().with_headers({'Content-Type': 'application/json'})
result = client.post(ctx.param('api_url'), json.dumps({'page': 1}))

request

ctx.http().request(method, url, body=None, auto_captcha=True) -> Response

Аргумент Тип Обязателен Назначение
method str Да HTTP-метод, например GET или POST.
url str Да Разрешённый HTTP(S)-адрес источника.
body str | dict | None Нет, default в сигнатуре Тело HTTP-запроса; для JSON передайте сериализованную строку.

Результат: Response. Объект SDK: используйте его методы, не передавайте целиком в emit.

Отправить запрос с явно указанным HTTP-методом. Обычно достаточно get или post.

result = ctx.http().request('GET', ctx.param('catalog_url'))

pool

ctx.http().pool(urls, auto_captcha=True) -> list[Response]

Аргумент Тип Обязателен Назначение
urls list[str] Да Небольшой список разрешённых HTTP(S)-адресов.

Результат: list[Response].

Загрузить небольшую пачку независимых URL параллельно.

result = ctx.http().pool([ctx.param('first_url'), ctx.param('second_url')])

Параллелизм и размер ответа. В обычном профиле передайте от 1 до 8 URL; одновременно работают максимум два запроса. На собственном агенте с включённым профилем «Высокая нагрузка» можно передать до 6000 URL. Одновременно выполняется не больше concurrency сайта и общей ёмкости сетевого компонента. Частота rps, короткий пик burst, robots.txt и остальные настройки продолжают действовать.

Список ответов возвращается в исходном порядке. Суммарный ответ SDK ограничен 8 000 000 байт вместе с метаданными. Для крупных HTML выбирайте небольшие пачки и обрабатывайте их по очереди. Сетевое исключение или превышение размера возвращает ошибку пула, усечённые тела не выдаются. HTTP-статус 404 или 500 сам по себе не является сетевым исключением: проверяйте status и response.ok() у каждого ответа. 6000 HTTP-запросов не означают 6000 браузеров или сценариев. Подробности: Высокая HTTP-нагрузка на агенте.

pages

ctx.http().pages(template, start, end, auto_captcha=True) -> Iterator[tuple[int, Response]]

Аргумент Тип Обязателен Назначение
template str Да URL-шаблон с {page}.
start int | str Да Начальная граница: число страницы либо начало искомого фрагмента.
end int | str Да Конечная граница: включительный номер страницы либо конец фрагмента.

Результат: Iterator[tuple[int, Response]].

Последовательно пройти известный диапазон страниц. В шаблоне номер обозначается {page}.

for number, response in ctx.http().pages(ctx.param('page_template'), 1, 3):
    ctx.log('Page loaded', {'page': number, 'status': response.status})

try_json

ctx.http().try_json(urls, auto_captcha=True) -> Any | None

Аргумент Тип Обязателен Назначение
urls list[str] Да Небольшой список разрешённых HTTP(S)-адресов.

Результат: Any | None.

Попробовать несколько адресов JSON по очереди и взять первый подходящий ответ.

result = ctx.http().try_json([ctx.param('first_url'), ctx.param('second_url')])

Ошибки и контекст выполнения

Все вызовы синхронны. Неверный аргумент или формат данных может вызвать ValueError/TypeError; отказ платформы или недоступность сервиса вызывает RuntimeError. Отсутствие элемента/значения даёт None либо пустой список только там, где это явно описано. Не превращайте любое исключение в пустой успешный результат. Методы внешних сервисов недоступны в преобразовании выгрузки; см. ограничения преобразований и среду.

Автоматическое прохождение CAPTCHA

Параметр auto_captcha необязательный, по умолчанию True. Передайте False, чтобы отключить автоматическое прохождение. При отключённом автоматическом режиме платные задания автоматически не запускаются. Общие настройки, поддерживаемые типы проверок и квоты продолжают действовать. Параметр есть у get, post, request, pool, pages и try_json.

response = ctx.http().get(url, auto_captcha=False)

CAPTCHA на своём агенте

Автоматический режим и отключение работают на агенте. Нужны браузер, связь с Akmelo и тариф с доступными агентами. Дополнительные ключи CAPTCHA настраивать не требуется. Проверки и стоимость относятся к пространству агента; локальное выполнение не делает их бесплатными.

Полный справочник CAPTCHA

SDK и REST API для CAPTCHA описывает все hints, значения по умолчанию, явный вызов, отключение, проверку результата, агенты, пределы и ошибки. Руководство пользователя и актуальные цены помогут настроить функцию и оплату.

Для выбора объектов используется kind: "yandex_image"; обычно тип определяется автоматически. image_selector указывает только картинку задания, instructions_selector порядок выбора, success_selector новый результат успешной операции. Список доменов целевых сайтов не нужен. Неизвестный вариант завершается ошибкой. Не запускайте бесконечные повторы при отказе.