Как извлекать данные с веб-страниц, рендерящихся с помощью JavaScript, с помощью Python
TL;DR
Используйте авторизованный JSON-эндпоинт, когда это возможно; он обычно более стабильный и дешевый, чем рендеринг браузера.
Playwright является основным методом на Python в этом руководстве, так как его локаторы, контексты и сетевые элементы управления подходят для современных страниц с рендерингом на клиенте.
Selenium по-прежнему полезен в организациях с установленным стеком WebDriver.
Scrapy плюс scrapy-playwright подходит для очередных парсингов, где требуется рендеринг только выбранных запросов.
Управляемый API рендеринга подходит, когда операции с браузером, повторные попытки и артефакты должны быть обязанностями сервиса.
Почему страницы с рендерингом на JavaScript возвращают пустое содержимое в Python?
Страницы с рендерингом на JavaScript возвращают пустое или частичное содержимое, потому что requests и подобные клиенты загружают начальный ответ, но не выполняют приложение. Nstdata Crawl может предоставить управляемый путь рендеринга, в то время как Playwright, Selenium и scrapy-playwright позволяют Python управлять браузером. Первый диагностический шаг - это сравнительный анализ "Просмотреть источник", отрендеренного DOM и ответов Fetch/XHR.
Статья о рендеринге на JavaScript объясняет, почему успех навигации отличается от готовности содержимого. Страница-скелет может вернуть статус 200, в то время как запрос данных может завершиться неудачей позже.
Что вам нужно перед тем, как парсить отрендеренную страницу?
Вам нужны разрешение, точная схема, небольшая целевая база данных, явные временные и бюджетные ограничения по страницам, а также один или несколько значимых сигналов готовности. Установите выбранные инструменты в изолированной среде.
На сайте, который вам принадлежит или который вы уполномочены инспектировать, откройте DevTools → Сеть → Fetch/XHR, перезагрузите страницу и вызовите контент. Определите публичный запрос, который возвращает необходимые записи.
Шаг 2: Воспроизвести один запрос
import httpx
r = httpx.get("https://example.com/api/items", params={"page":1}, timeout=20)r.raise_for_status()items = r.json().get("items",[])
Шаг 3: Ограничить пагинацию
Остановитесь на задокументированном курсоре, пустой странице или установленном максимуме. Не повторяйте приватные вызовы приложения и не копируйте учетные данные сессии без разрешения.
Метод 2: Отображение с Playwright
Шаг 1: Начать контекст браузера
from playwright.sync_api import sync_playwright
with sync_playwright()as p: browser = p.chromium.launch(headless=True) page = browser.new_page(viewport={"width":1365,"height":900}) page.goto("https://example.com/app", wait_until="domcontentloaded") page.locator("[data-testid='item']").first.wait_for(timeout=10000) rows = page.locator("[data-testid='item']").all_inner_texts() browser.close()
Шаг 2: Ждите доказательств, а не времени
Предпочитайте стабильный селектор или конкретный ответ, который предоставляет данные. networkidle может быть неподходящим для приложений с аналитикой или долговременными соединениями.
Шаг 3: Проверьте состояние страницы
Проверьте конечный URL, заголовок, ожидаемые элементы управления, количество строк и сделайте снимок экрана в случае сбоя. Отвергайте общие ошибки и состояния, требующие согласия.
Метод 3: Используйте Selenium с явными ожиданиями
Шаг 1: Перейдите с помощью WebDriver
Создайте драйвер, установите таймаут загрузки страницы и откройте одну утвержденную страницу. Избегайте смешанных неявных ожиданий и явных ожиданий, так как комбинированное время трудно оценить.
Шаг 2: Ждите контейнер результата
Используйте WebDriverWait и ожидаемое условие для фактического контента. Избегайте time.sleep() в качестве основного механизма готовности.
Шаг 3: Всегда закрывайте драйвер
Используйте try/finally или контекстный обертку, чтобы не допустить утечек процессов браузера при сбоях.
Метод 4: Выборочное добавление рендеринга в Scrapy
Шаг 1: Включите scrapy-playwright
Настройте обработчик загрузки и реактор точно так, как документировано для установленной версии. Зафиксируйте версии Scrapy, Playwright и плагинов вместе.
Шаг 2: Отмечайте только рендеренные запросы
Отправляйте статические страницы через обычный загрузчик Scrapy и добавляйте meta={"playwright": True} только там, где требуется рендеринг. Это сохраняет параллелизм и снижает затраты на браузер.
Шаг 3: Закрывайте объекты страницы
Если обратный вызов получает страницу Playwright, закройте ее как в случае успеха, так и в случае исключений. Контролируйте открытые страницы и память браузера.
Метод 5: Используйте управляемый сервис рендеринга
Шаг 1: Определите минимальный запрос
Используйте Nstdata Crawl для управляемого доступа к страницам, рендеринга, трансформации и обработки задач, когда эти операции не должны находиться в приложении. Запрашивайте только необходимые форматы и взаимодействия.
Шаг 2: Периодически опрашивайте ограниченную асинхронную работу
Используйте терминальные состояния, максимальную продолжительность и экспоненциальную обратную связь с джиттером. Осматривайте информацию об уровне тела о success, статус и ошибках, а не только код транспортировки.
Шаг 3: Проверьте стоимость за принятую страницу
Используйте цены на Nstdata Crawl для текущей модели биллинга. Включите отклоненные и повторные страницы при сравнении затрат с саморазмещаемыми браузерами.
Как вы собираетесь собирать бесконечный скролл и ленивый контент?
Предпочитайте исходный курсор или конечную точку страницы, когда это допустимо. Если требуется скроллинг, запишите текущее количество элементов, прокрутите один раз, дождитесь увеличения и остановитесь, когда количество не изменится или будет достигнуто максимальное количество циклов. Ленивая загрузка изображений может потребовать пересечения области видимости, но прокрутка всей страницы может непреднамеренно вызвать неограниченные потоки.
Руководство по динамическим средствам сбора данных предлагает дополнительный контекст для выбора методов. Держите открытие URL и принятие элементов отдельно, чтобы повторяющиеся карточки не становились дублирующими записями.
Какие ошибки должен обрабатывать скребок рендеренной страницы?
Обрабатывайте таймаут навигации, таймаут селектора, сбой браузера, отказ в доступе, неправильный язык, пустой результат, ошибки разбора и ошибки хранения как отдельные состояния. Повторяйте только временные классы. Захватывайте санитарные диагностики, а не куки или токены. Протокол исключения роботами — это один из политических входов; он не заменяет юридический и контрактный обзор.
Заключение
Используйте сетевой конечный пункт в первую очередь, Playwright для современных страниц, зависящих от браузера, Selenium для устоявшихся сред WebDriver и scrapy-playwright для выборочной отрисовки внутри краулера. Переходите на управляемый сервис, когда операции с браузером, а не логика извлечения занимают бюджет на разработку. Проверяйте каждый метод на одном и том же корпусе и измеряйте принятые записи. Менеджер прокси Nstdata может быть оценен отдельно, когда маршрутизация и мониторинг между прокси-источниками становятся отдельной проблемой.
Испытайте Nstdata — начните бесплатную пробную версию сегодня
Q: Может ли Beautiful Soup извлекать контент, отрисованный JavaScript?
Beautiful Soup может анализировать отрисованный HTML после выполнения JavaScript другим инструментом, но сам JavaScript не выполняет.
Q: Должен ли Playwright ждать networkidle?
Только когда тихое состояние сети является значимым условием для цели. Стабильный селектор или известный ответ данных часто более точны.
Q: Может ли Scrapy отрисовывать JavaScript?
Scrapy сам по себе не отрисовывает JavaScript, но интеграции, такие как scrapy-playwright, могут маршрутизировать выбранные запросы через браузер.
Q: Почему безголовый режим возвращает разные данные?
Размер окна, локаль, версия браузера, время, разрешения и поведение цели могут отличаться. Сравните конфигурации и сохраните скриншот, прежде чем предполагать, что селектор неправильный.
Q: Сколько страниц браузера должно работать одновременно?
Конкуренция зависит от памяти, ЦП, политики цели и веса страницы. Начинайте с низких значений, измеряйте использование ресурсов браузера и скорость принятия страниц, и установите жесткий предел.
Страницы, рендерящиеся с помощью JavaScript, требуют метода, который соответствует их пути данных. Этот справочник охватывает извлечение сетевых данных, три подхода браузера и управляемый рендеринг.
Ivy Lin
Sep. 28th 2026
Попробуйте Nstproxy Crawl - Начните Бесплатно Уже Сегодня
Сканируйте целые сайты одним API-запросом
Преобразуйте любой сайт в Markdown, HTML, JSON, ссылки, PDF и другие форматы без управления инфраструктурой сканирования.