Назад в Центр знаний
Начало работы

Сбор данных Selenium: capabilities и записи

Ограниченный запуск Selenium с явным бинарным файлом Chromium, записью capabilities и проверкой результатов.

BotBrowser Team

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

Нужна структурированная документация по теме Начало работы?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Selenium может управлять браузером для разрешенного сбора данных, но успешное создание сеанса WebDriver остается лишь одним этапом задачи. Нужно также записать бинарный файл и согласованные параметры сеанса, дождаться фактического сигнала готовности собственной страницы, проверить каждую запись и остановиться при ограничении доступа или соответствующем ответе сайта. BotBrowser документирует передачу профиля файлом и параметры запуска CLI; BotBrowser задает входные данные браузера, но не гарантирует загрузку профиля, совместимость Selenium/Grid или ответ стороннего сайта. За сеанс WebDriver и контракт сбора данных конкретного приложения отвечает сам проект сбора.

Этапы сбора данных в Selenium: запуск браузера, сведения о сеансе, готовность страницы, проверка записей и остановка по политике

Кратко

  • Намеренно выберите исполняемый файл браузера с помощью API параметров браузера, а затем запишите возможности, возвращаемые новым сеансом WebDriver, вместо того, чтобы предполагать, что запрошенные значения были приняты.
  • Разделяйте файл профиля BotBrowser, каталог пользовательских данных Chromium, службу Selenium и результаты запуска; назначайте владельца каждому элементу.
  • driver.get() сообщает о границе навигации по документу; результаты приложения каталога, отображаемые клиентом, требуют отдельного ограниченного условия готовности.
  • Проверяйте строку как данные: перед приемом требуйте заголовок, URL страницы с тем же origin, а также цену или явный статус доступности.
  • Значение navigator.webdriver и возвращаемые возможности описывают сеанс, управляемый автоматизацией; они не подтверждают личность, авторизацию, загрузку профиля или решение сайта.

Содержание

Определите прогон и его доказательства

Начните с одного каталога, которым вы владеете или имеете право собирать. Запишите разрешенный URL-адрес входа, поля, необходимые для последующего задания, максимальное количество записей, частоту запросов, разрешенную его владельцем, и условия остановки. Это не бюрократия вокруг сценария браузера: он отделяет страницу, отображающую пустой каталог, от сценария, который молча принимает искаженные данные. Ограниченный прогон может прочитать одну страницу каталога, собрать не более 40 видимых карточек и выдать одну строку JSON для каждой принятой карты. Значение 40 , это лимит задач, выбранный владельцем, а не рекомендуемая норма для других сайтов.

Храните контракт задачи рядом с кодом. Например, определите title как обрезанный непустой текст, href как абсолютный URL-адрес утвержденного источника каталога и price как десятичную сумму плюс валюту или явное значение availability, например out-of-stock. Не превращайте отсутствующее значение в вымышленное значение по умолчанию, например ноль. Нулевая цена, отсутствующая цена и цена, скрытая за запросом согласия, , это три разных состояния. Сохраните различие в записи, чтобы потребитель мог решить, пригодна ли эта строка для использования.

Запись о запуске должна описывать входные данные, которые могут изменить результат без ненужного сохранения содержимого страницы: версия устройства приложения, URL-адрес записи, выбранный двоичный идентификатор браузера, версия драйвера, версия браузера, выбранная стратегия загрузки страницы, локаль, если это необходимо, время начала выполнения и количество принятых и отклоненных записей. Исключите секреты учетной записи, файлы cookie, заголовки авторизации, полные каталоги профиля и несвязанный текст страниц. Если для сбоя требуется снимок экрана или отрывок из DOM, захватывайте только принадлежащее ему синтетическое устройство или наименьший утвержденный регион, редактируйте пользовательские данные и следуйте политике хранения приложения.

Прежде чем подключаться к работам по сбору мусора, используйте известное приспособление. Принадлежащий прибор может отображать предсказуемый маркер готовности, небольшой набор строк, одну недостающую цену и преднамеренное состояние отказа в доступе. Это позволяет сценарию доказать, что он принимает действительные строки, отклоняет неполные строки и останавливается на границе политики. Это приспособление является проверкой вашего контракта на добычу; он не устанавливает, как реагирует другой сайт или что делает детектор.

Для страницы списка со ссылками, которые могут вести на страницы с подробными сведениями, перед реализацией решите, предусмотрена ли навигация по подробным сведениям. В примере намеренно записываются только карточки каталога. Он не посещает их ссылки, поскольку навигация по страницам с подробными сведениями вводит контракт на вторую страницу, дополнительные запросы и новую границу разрешений. Отдельная задача может определить эти правила, если владелец данных разрешит это. Это различие обеспечивает возможность аудита снимка списка и предотвращает автоматическое расширение коллекции в удобном цикле.

Выберите браузер и настройте сеанс

Документация Selenium по Chrome показывает, как параметры Chrome позволяют выбрать бинарный файл браузера и добавить аргументы. Здесь исполнитель выбирает установленный исполняемый файл на базе Chromium; это не подтверждает совместимость с любой версией браузера или драйвера. Зафиксируйте версии браузера и драйвера по процессу выпуска среды и укажите их в записи запуска. Если сеанс не создается, сначала проверьте поиск бинарного файла и совместимость драйвера, а не меняйте селекторы или схему данных.

Рецепты BotBrowser для CLI показывают, как передать файл профиля через --bot-profile и использовать отдельный --user-data-dir. В справке по конфигурации профилей указано, что аргументы CLI имеют приоритет над настройками профиля и значениями по умолчанию, общедоступные устаревшие файлы .enc доступны только для чтения, профиль передается как файл, а его основная версия должна совпадать с основной версией бинарного файла. Это входные данные запуска браузера, а не capabilities Selenium и не параметры, созданные через Options.set_capability(). В среде с явной поддержкой выбранных бинарного файла и драйвера авторизованный исполнитель может передать документированные аргументы браузера через Chrome options. Нужны абсолютный разрешенный путь к файлу профиля и отдельный каталог пользовательских данных; соблюдайте применимую политику продукта и организации.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait

options = Options()
options.binary_location = "/opt/approved-browser/chrome"
options.add_argument("--bot-profile=/srv/browser-inputs/profile.enc")
options.add_argument("--user-data-dir=/srv/browser-state/run-2026-11-08-01")
options.page_load_strategy = "eager"

driver = webdriver.Chrome(options=options)
try:
    driver.set_page_load_timeout(35)
    driver.get("https://catalogue.example.test/items")
    WebDriverWait(driver, 18).until(
        lambda browser: browser.find_element(
            "css selector", "[data-testid='catalogue-ready']"
        ).get_attribute("data-state") == "ready"
    )
finally:
    driver.quit()

Указанные выше пути являются заполнителями для путей, настроенных авторизованным исполнителем. Не размещайте учетные данные в аргументе профиля, исходном файле или журналах. Не используйте одновременно профиль или каталог пользовательских данных. Управляемый каталог может содержать состояние, которое сохраняется после одного вызова сценария; назначьте одного владельца, решите, является ли он эфемерным или сохраненным, и закройте браузер перед повторным использованием. Selenium руководство по сеансам драйверов описывает создание сеанса путем создания драйвера и завершения его с помощью quit(). Блок finally важен, поскольку навигация, готовность и извлечение могут подняться до нормального завершения выполнения.

Для удаленного WebDriver или Grid исполняемый файл браузера и пути к файлам интерпретируются на узле, который запускает браузер, а не обязательно в процессе отправки команд Python. Локальный абсолютный путь на клиентском компьютере не является допустимым путем к удаленному узлу только потому, что он существует локально. Укажите в развертывании образ узла, версию браузера, подготовку драйверов, доставку профиля и контракт временного хранения. Если участник не может доказать, где смонтирован файл профиля и кому принадлежит каталог пользовательских данных, не начинайте сеанс с неоднозначным состоянием.

Выбирайте стратегию загрузки страницы для границы документа, а не как ярлык для динамической готовности приложения. Selenium документирует normal как ожидание полного состояния документа, eager как возврат, когда документ является интерактивным, и none как не ожидание состояния загрузки страницы. Этот параметр применяется к сеансу WebDriver. Настройка «медленнее» или «быстрее» не определяет, когда можно использовать данные каталога одностраничного приложения; явное условие готовности все еще владеет этим контрактом приложения. Для большинства страниц данных начните со значения по умолчанию normal, если только у приложения нет причины вернуться раньше и в сценарии не указан явный предикат на уровне страницы.

Запись возможностей сессии и границы их интерпретации

После запуска драйвера сохраните небольшую проверенную проекцию возвращенного driver.capabilities. [Справочник по опциям браузера] Selenium(https://www.selenium.dev/documentation/webdriver/drivers/options/) документирует общие возможности сеанса, включая browserName, browserVersion, platformName и pageLoadStrategy; имя браузера задается при использовании соответствующего класса опций. Эти значения являются подтверждением согласованного сеанса WebDriver. Они позволяют оператору сравнить то, что запросил бегун, с тем, что сообщает водитель. Они не доказывают, что был принят зашифрованный профиль, что была загружена каждая поверхность, поддерживаемая профилем, или что веб-сайт принял браузер.

capabilities = driver.capabilities
capability_receipt = {
    "browserName": capabilities.get("browserName"),
    "browserVersion": capabilities.get("browserVersion"),
    "platformName": capabilities.get("platformName"),
    "pageLoadStrategy": capabilities.get("pageLoadStrategy"),
}

Прежде чем продолжить, подтвердите чек. Если browserName не идентифицирует ожидаемое семейство браузеров или browserVersion отсутствует в разрешенном диапазоне бегуна, остановитесь и классифицируйте среду как ошибку конфигурации сеанса. Не перезаписывайте поле версии результата из запрошенного двоичного пути. Если драйвер предоставляет дополнительные поля, зависящие от поставщика, сохраняйте их только тогда, когда их значение документировано и они нужны владельцу коллекции. Дамп всего объекта возможностей может сохранить метаданные, специфичные для реализации, и усложнить сравнение без улучшения результата.

Сохраняйте запрошенную конфигурацию и полученную квитанцию ​​в виде отдельных полей записи. В конфигурации может быть указано page_load_strategy="eager", тогда как ответ драйвера сообщает другое согласованное значение; это несоответствие должно быть заметно. Аналогичным образом, путь к профилю в конфигурации бегуна является входными данными, а не подтверждением того, что браузер загрузил этот профиль. Подтверждайте загрузку профиля только с помощью документированного подтверждения запуска продукта и соответствующей авторизованной процедуры. Никакого выполнения BotBrowser или ответа третьих лиц не требуется.

Квитанция должна быть написана перед навигацией, а затем обновлена ​​с учетом результатов терминала. Полезными категориями терминалов являются session-start-failed, navigation-timeout, readiness-timeout, access-boundary, schema-rejected, complete и cleanup-failed. Оставьте одну категорию для первой неудачи, которая объясняет, почему сбор данных прекратился; исключение последующей очистки может быть записано отдельно. Это позволяет избежать преобразования ответа доступа в ошибку селектора только потому, что сценарий продолжил поиск по странице после того, как сайт приказал ему остановиться.

Дождитесь готовности каталога

Успешное выполнение driver.get() не означает, что каждая строка каталога была вставлена ​​или гидратирована. Он сообщает о выбранной границе навигации по документу. После этого клиентский код может получить данные, отобразить заполнитель загрузки, а затем заменить его карточками. И наоборот, страница может продолжить загрузку несвязанных рекомендаций после того, как запрошенный список будет готов. Ожидание прекращения любой сетевой активности не обязательно является значимым условием для бизнеса. В коллекции должен быть указан конкретный маркер, который означает, что запрошенные строки принадлежащего каталога готовы.

Используйте один явный WebDriverWait для стабильного условия, предоставленного авторизованной страницей. Элемент с документированным data-state="ready", доступным сообщением о состоянии или известным счетчиком результатов может стать подходящим предикатом. Избегайте опроса произвольного класса, используемого только анимацией, или ожидания фиксированных 10 секунд. Фиксированная пауза может привести к потере времени, когда результат будет готов быстро, и к сбою, когда услуга займет больше времени. Ограниченное ожидание возвращает действенный результат, если условие не достигнуто. Выберите тайм-аут из выделенного бюджета службы; 18 секунд в коде являются иллюстративными, а не универсальными значениями Selenium.

Предикат готовности должен быть доступен только для чтения. WebDriver может оценивать его повторно, поэтому он не должен щелкать элемент управления, отправлять форму, прокручивать страницу для запуска дополнительных записей или изменять страницу как побочный эффект. Если нумерация страниц является разрешенной частью коллекции, смоделируйте ее как отдельные переходы: проверьте состояние готовности текущей страницы, запишите принятые строки, выполните одно действие на следующей странице, затем дождитесь отдельного состояния или идентификатора следующей страницы. Остановитесь на согласованном максимуме и запишите, что предел достигнут. Не продолжайте нажимать, потому что номер страницы не изменился.

Регулирование может привести к различным наблюдаемым результатам. Ограниченный ответ повторной попытки, область состояния приложения, предлагающая пользователю подождать, страница запроса, перенаправление входа и селектор, который больше не соответствует, не являются взаимозаменяемыми. Соблюдайте документированную политику доступа к сайту и разрешенный бюджет запроса владельца. Когда на странице отображается граница доступа или политики, остановите запуск и сохраните только минимальную категорию, необходимую владельцу. Не автоматизируйте решение задач, не обходите средства контроля и не увеличивайте интенсивность запросов, чтобы добиться результатов. Сценарий Selenium может сообщить, что ожидаемое состояние приложения не получено; он не может решить, разрешен ли постоянный доступ.

Проверка записей и классификация результатов

Перед сериализацией извлеките каждую строку в типизированную запись. Удаляйте пробелы из видимого текста, разрешайте ссылки относительно URL-адреса каталога, требуйте разрешенное происхождение и отклоняйте неверные значения. Если цены имеют разделитель, зависящий от языкового стандарта, анализируйте их в соответствии с объявленным языковым стандартом страницы, а не слепо удаляйте знаки препинания. Если на странице могут отображаться и цена, и наличие, сохраните и то, и другое. Избегайте хранения описаний продуктов или текста страниц, если для задачи требуется только заголовок, URL-адрес и пара цена/статус.

from urllib.parse import urljoin, urlparse

def normalized_origin(url):
    try:
        parsed = urlparse(url)
        hostname = parsed.hostname
        port = parsed.port
    except ValueError:
        return None
    scheme = parsed.scheme.lower()
    if scheme not in {"http", "https"} or not hostname or parsed.username is not None or parsed.password is not None:
        return None
    effective_port = port if port is not None else (443 if scheme == "https" else 80)
    return scheme, hostname.lower(), effective_port

def parse_card(card, page_url, allowed_origin):
    title = card.find_element("css selector", "[data-testid='title']").text.strip()
    href = card.find_element("css selector", "a[data-testid='detail-link']").get_attribute("href")
    absolute_url = urljoin(page_url, href or "")
    price_nodes = card.find_elements("css selector", "[data-testid='price']")
    status_nodes = card.find_elements("css selector", "[data-testid='availability']")
    price = price_nodes[0].text.strip() if price_nodes else None
    status = status_nodes[0].text.strip() if status_nodes else None

    if not title or normalized_origin(absolute_url) != allowed_origin:
        return None, "schema-rejected"
    if not price and not status:
        return None, "missing-price-or-status"
    return {"title": title, "href": absolute_url, "price": price, "status": status}, None

Вычислите allowed_origin один раз по разрешенному начальному URL той же функцией normalized_origin, а не по извлеченной ссылке. Этот пример принимает только HTTP и HTTPS и сравнивает нормализованные схему, имя хоста и эффективный порт, включая значения по умолчанию 80 и 443; некорректный порт отклоняется. Централизуйте нормализацию URL и проверяйте порты по умолчанию, интернационализированные имена хостов, перенаправления и относительные ссылки. Не открывайте возвращенный href только потому, что он есть в карточке. Извлечение данных и навигация требуют отдельных разрешений.

Не рассматривайте пустой набор результатов как успешную коллекцию. Пустой список может быть действительным каталогом, но это также может означать, что маркер готовности появился до вставки данных, фильтр удалил все строки или изменился контракт страницы. Требовать счетчик результатов или явный маркер пустого состояния. Если страница объявляет нулевые результаты, выдайте результат empty-catalogue с версией страницы и остановитесь; не делайте вывод, что селектор сломан, и не повторяйте один и тот же запрос бесконечно. Если ожидаемый маркер готовности отсутствует, классифицируйте тайм-аут готовности, а не возвращайте пустой успешный файл.

Цикл извлечения должен подсчитывать результаты и сохранять причину каждого отклонения. Например, 36 принятых строк, две отсутствующие цены и два нарушения одного и того же происхождения отличаются от 40 принятых строк. В сводке может быть указано accepted=36, rejected=4 и учитывается причина, не сохраняя тела отклоненных страниц. Это делает изменение схемы видимым, минимизируя при этом хранящиеся личные или коммерческие данные. Отклоняйте повторяющиеся нормализованные URL-адреса, если нижестоящее задание ожидает одну запись каталога для каждого продукта, но сообщайте о количестве дубликатов вместо того, чтобы автоматически перезаписывать более раннюю строку.

Используйте таблицу отказов, чтобы направить диагностику на уровень, которому она принадлежит:

РезультатДоказательства, чтобы сохранитьСледующий владелец
Браузер или драйвер не могут создать сеансошибка исправленного драйвера, запрошенный двоичный идентификатор, версии драйвера и браузеравладелец изображения бегуна
Возможности не соответствуют списку разрешенийполучение возможности с четырьмя полями и запрошенная стратегияВладелец конфигурации WebDriver
Навигация превышает границыхост URL-адреса записи, категория тайм-аута, состояние последней готовностивладелец приложения или сети
Готовность каталога отсутствуетимя состояния готовности, истекшее время ожидания, количество результатов, если они естьстраница владельца контракта
Строка не соответствует схемепричина на уровне поля и совокупное количество отклоненийвладелец контракта на добычу
Сайт сообщает о границе доступакатегория ответа или видимый статус, без содержания запросавладелец политики сайта
quit() повышает ставку после очередной неудачиисходный сбой плюс категория ошибок очисткивладелец жизненного цикла бегуна

Эта таблица не является лицензией на сбор большего количества диагностических данных, чем необходимо. Полный HAR, копия профиля, база данных браузера или скриншот с аутентификацией могут включать учетные данные и несвязанные действия. Начните с самых маленьких полезных доказательств и расширяйте их только тогда, когда владелец разрешит это и политика конфиденциальности это позволит. Сохраняйте выходные пути в пределах выполнения и истечайте их срок действия в соответствии с правилами хранения данных проекта.

Держите границы идентичности явными

Файл профиля, двоичный файл браузера, параметры WebDriver и значения, предоставляемые JavaScript страницы, являются связанными, но разными слоями. Конфигурация профиля может предоставлять документированные настройки браузера, а переопределения командной строки имеют приоритет над конфигурацией профиля и настройками по умолчанию. Выбранный двоичный файл должен быть совместим со своим основным профилем согласно документации продукта. Затем возможности драйвера описывают согласованный сеанс WebDriver. Ни один из этих фактов сам по себе не доказывает каждое видимое на странице значение, непрерывность идентичности при разных запусках или то, как сервер классифицирует запрос.

MDN описывает navigator.webdriver как логическое значение, доступное только для чтения, указывающее, контролируется ли пользовательский агент с помощью автоматизации. Это один из видимых браузером сигналов автоматизации. Это не токен идентификации, разрешение, общий отпечаток пальца или вердикт системы обнаружения сайта. Если авторизованному устройству необходимо записать его для проверки совместимости, запишите логическое значение с его страницей и контекстом браузера; не интерпретируйте его как оценку «прошел/не прошел» для несвязанных решений о доступе.

Сохраняйте такое же различие в отчетах. Полезное утверждение: «Сеанс WebDriver начался с браузера версии X, и прибор вернул 36 действительных записей каталога». Неподдерживаемые утверждения включают в себя «браузер выглядел как человеческий», «профиль подтверждает личность учетной записи» или «сайт примет этот сеанс». Первый оператор следует за возвращенными возможностями и вашей собственной проверкой схемы. Остальные заявляют о внешних суждениях, которые эти наблюдения не могут установить.

Общедоступные справка по конфигурации профилей и рецепты CLI BotBrowser описывают входные данные браузера; они не обеспечивают совместимость драйверов Selenium и не меняют семантику протокола WebDriver. Команде следует проверить конкретные бинарный файл, драйвер, пакет профиля, ОС и конфигурацию развертывания в поддерживаемой среде. Не представляйте общий фрагмент Selenium как сертификацию продукта и не обещайте, что стороннее приложение разрешит сбор данных.

В качестве смежного различия интеграция профиля браузера Selenium и владение сеансом охватывает владение хранилищем и жизненный цикл профиля, а ожидание и стабильные тесты Selenium WebDriver более подробно описывает семантику ожидания. Запись парсинга остается привязанной к квитанции о возможности, условию готовности одной страницы, схеме строки и границе остановки. Детали реализации браузера не должны заменять разрешение владельца данных или контракт приложения.

Частые вопросы

Означает ли driver.get() каталог готов?

Нет. Стратегия загрузки страниц отмечает состояние документа; приложение может заполнить свои результаты позже. Дождитесь собственного ограниченного сигнала готовности.

Доказывают ли возможности, что профиль загружен?

Нет. Они описывают переговорную сессию. Для загрузки профиля требуются свидетельства запуска, поддерживаемые продуктом, и авторизованная процедура.

Должна ли быть открыта каждая извлеченная ссылка?

Нет. Детальная навигация расширяет задачу и ее запросы. Делайте это только тогда, когда область действия и полномочия определяют второй контракт.

Источники

Практический вывод

Рассматривайте задание парсинга Selenium как цепочку независимо проверяемых границ: авторизованная задача и схема записи, выбранный браузер и драйвер, возвращенное уведомление о возможности, ограниченное условие готовности, проверенные строки и обычное завершение сеанса. Разделяйте входные данные профиля и каталог пользовательских данных, сообщайте о первой ошибке на уровне, которому они принадлежат, и останавливайтесь на границе доступа к сайту. Полученная запись может объяснить, что ваш бегун заметил в принадлежащем вам каталоге. Он не может установить загрузку профиля без собственных доказательств продукта или предсказать решение стороннего сайта.

#Selenium#WebDriver#Профили Браузера#Сбор Данных

Эта статья входит в руководство: Начало работы с автоматизацией браузера: карта

Выполните ту же проверку в BotBrowser

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