Pull to refresh

Почему Playwright или как получить динамический контент?

В статье сделан упор на рассмотрение инструмента для загрузки динамических веб-страниц playwright и сравнение его с другими доступными инструментами с точки зрения получения большого количества страниц и внедрения готового решения.

Статический и динамический контент

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

Ленты Instagram, Twitter, страницы Facebook и многие другие содержат в себе динамический контент.

Как добраться до динамически подгружаемого контента?

В случае со статическими страницами все просто: запрос, ответ, и обработка ответа как душе угодно.

В случае с динамическими страницами всё немного сложнее. Страницы нужно открывать в браузере, это позволяет исполнится Javascript коду. Классический вариант Selenium, инструмент для автоматизации действий в браузере. Имеет широкий функционал, умеет выполнять Javascript код, делать скриншоты страниц и прочее. Из коробки не всегда гладко работает с proxy и кастомными user agent (помогает selenium-wire).

Selenium используют браузер вашей локальной машины, что и является, на мой взгляд, главным недостатком. Запустить его в Docker контейнере достаточно сложно. Да, есть selenoid с большим семейством браузеров уже упакованных в контейнеры, однако там тоже не все гладко с proxy и user agent.

Splash - быстрый, легковесный браузер с HTTP интерфейсом, который может быть запущен как отдельный контейнер. Параметры и действия можно описывать на Lua. Умеет открывать динамические страницы, может легко жить в Docker контейнере, поддерживает proxy, кастомные headers. Очень удобен в разработке, т.к. его можно открыть через браузер и дебажить Lua скрипты прямо там.

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

То ради чего мы здесь. Playwright - библиотека от Microsoft, стабильная версия которой вышла в 2020 году, с таким же широким функционалом как selenium или splash, однако имеющая некоторые преимущества. Как и Selenium, Playwright использует полноценные браузеры, но не уже установленные, а подтягивает их при установке, что существенно упрощает контейниризацию приложений.

Code

Взглянем на код. Playwirght может быть запущен как синхронно, так и асинхронно. Рассмотрим второй вариант.

async with async_playwright() as p:
    browser_type = p.chromium

Playwright поддерживает firefox, chromium и webkit.

browser = await browser_type.launch(headless = False)
page = await browser.newPage(userAgent = useragent, viewport = {"width": 1600, "height": 900})

Браузер может быть запущен как в headless режиме, т.е. скрытом, так и в открытом режиме. При запуске браузера может быть указан прокси.

При загрузке страницы можно передать user agent, размеры окна и прочие параметры.

await page.goto(url, timeout = 0)
html = await page.content()

Загрузка страницы и получение html содержимого.

await page.evaluate("window.scrollTo(0, document.body.scrollHeight);")

Можно исполнить javascript код, в данном случае проскроллить до конца страницы.

Весь код можно глянуть по ссылке. Репозиторий содержит примеры для Splash и Selenium.

Итог

Selenium

  • Плюсы: полноценно открывает страницы; имеет широкий функционал взаимодействия со страницей

  • Минусы: сложность переноса и внедрения из-за использования локального браузера; не всегда гладко работает с proxy и user agent

Splash

  • Плюсы: докерезирован, что позволяет его легко переносить и внедрять; простота разработки

  • Минусы: может быть определён веб-сайтом, и как следствие не получит контент

Playwright:

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

  • Минусы: может требовать много оперативной памяти на больших страницах. Хотя этот минус актуален не только для Playwright

Вместо выводов

Microsoft выпустил отличный инструмент на поле, где, казалось, уже все реализовано, что радует. После перевода своих проектов с Selenium на Playwright, жить стало приятнее.

Уточнения, дополнения, критику буду рад видеть в комментариях.

В статье не рассматривается как парсить уже полученный html, нет рецептов обхода блокировок, ротации прокси т.п.

Если Вам нужна будет помощь в получении данных, их обработке, создании моделей - мой контакт, мой контакт 2.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.