TypeScript SDK: Работа с CAPTCHA: сценарии и их устройство
В этом разделе разбираем 12 сценариев ScrapingCourse на TypeScript. Здесь есть полный каталог, постраничная выдача, кнопка загрузки, прокрутка, вход, JavaScript-отрисовка, таблица и контрольные страницы. Для каждого варианта приведены параметры, полный код и объяснение шагов.
С чего начать
- Откройте сайт с адресом
https://www.scrapingcourse.comили добавьте его в своё пространство. - Выберите сценарий из списка ниже и язык TypeScript.
- Скопируйте полный код из его статьи. Введите
path,modeиexpectedв параметрах запуска точно как в примере. - Для каталога подготовьте поля
name(строка),price(число) иimage(строка). Контрольным страницам нужныname(строка) иpassed(логическое). - Проверьте пробный результат, затем сохраняйте версию и настраивайте расписание под свою задачу.
Где в алгоритме CAPTCHA
Сценарий описывает действия с данными: открывает страницу, заполняет форму, ждёт товары и сохраняет записи. Работа с дополнительной проверкой страницы определяется настройками сайта и параметром auto_captcha. Её внутренние механизмы не являются частью алгоритма извлечения полей.
В полном исходнике auto_captcha по умолчанию равен true. Значение false отключает автоматическую обработку для запросов и браузерной сессии этого запуска. В PHP, JavaScript и TypeScript в SDK передаётся аргумент autoCaptcha, в Python он называется auto_captcha; в этих исходниках используется позиционная передача значения auto.
Отдельный вызов решения проверки примеры не используют. Успех сценария определяется полученными данными или контрольной фразой страницы.
Настройки CAPTCHA и расходы · Параметры SDK и API
Параметры общего исходника
| Параметр | Назначение |
|---|---|
path |
Путь после https://www.scrapingcourse.com, например /pagination. |
mode |
Ветка: http, browser, button, scroll, login или challenge. |
expected |
Ожидаемое число уникальных товаров; для контрольной страницы указан один результат. |
auto_captcha |
Необязательный логический параметр, по умолчанию true. |
Один исходник поддерживает все варианты таблицы ниже. Сценарий выбирается параметрами, поэтому общие части не приходится переписывать при переходе от пагинации к входу.
Как устроен сбор полей
В начале запуска создаётся seen: память ключей, уже обработанных в этом запуске. Сборщик выбирает .product-item, li.product, читает название и пропускает элементы без названия. Ссылка карточки используется как ключ, имя служит запасным вариантом. Поэтому товары с одинаковыми названиями, но разными ссылками остаются отдельными записями.
name берётся из .product-name, .woocommerce-loop-product__title, price из .product-price, .price и преобразуется методом money. В image записывается адрес из img[src]. Сохранение самого файла и работа с хранилищем описаны в Storage.
Второй аргумент emit задаёт ключ записи. Повторное чтение всей страницы не создаёт новый результат для уже встреченного ключа: его отсеивает seen. Состояние сохраняется только внутри данного запуска; между запусками пример не хранит список в KeyValue.
В HTTP-ветке есть отдельная память visited для адресов страниц. Не путайте её с seen: страницы могут быть разными, но содержать один товар. В браузерной ветке finally освобождает страницу даже при ошибке.
Что важно в TypeScript
В TypeScript ctx: Akmelo.Context даёт подсказки методов SDK, Promise<void> описывает результат run, а Set<string> хранит строковые ключи. Эти типы не меняют порядок действий: сетевые и браузерные вызовы по-прежнему требуют await. collect(html: string): number возвращает число карточек текущей страницы.
Для входа email сначала читается из текстовой подсказки. Если страница представляет его атрибутом data-cfemail, код также умеет прочитать этот вариант. Пароль берётся из той же открытой демонстрационной подсказки.
Все 12 сценариев
| Пример | Режим | Ожидаемый результат |
|---|---|---|
| Интернет-магазин: все страницы каталога | http |
188 |
| Пагинация: переход по ссылке «Далее» | http |
147 |
| Кнопка «Показать ещё»: загрузка порциями | button |
147 |
| Бесконечная прокрутка: дождаться конца ленты | scroll |
147 |
| Вход на сайт: получить каталог после авторизации | login |
12 |
| Вход с CSRF: сохранить состояние формы | login |
12 |
| Форма входа Cloudflare: продолжить сбор в одной сессии | login |
12 |
| Форма с Turnstile: дождаться каталога после входа | login |
12 |
| JavaScript-страница: дождаться заполненных карточек | browser |
12 |
| Табличный каталог: получить строки товаров | http |
15 |
| Страница Cloudflare: проверить полученное содержимое | challenge |
1 |
| Страница Antibot: сохранить результат проверки | challenge |
1 |
Числа в таблице относятся к настроенному демонстрационному набору. В статьях описаны проверка полноты, условия завершения и назначение каждого поля. Полный код можно копировать из любого разбора, сохраняя параметры именно выбранного примера.
Облако и собственный агент
Один исходник можно запускать в облаке или на своём агенте. Место выполнения выбирается в настройках сайта. Для браузерных примеров агенту нужны поддержка браузера и исполнитель выбранного языка. Разбор полей и параметры запуска остаются теми же. Порядок подключения описан в разделе об агентах.