Веб-скрапинг
Коротко: Автоматическое извлечение данных с сайтов с помощью скрипта — либо из сырого HTML, либо через официальный API, если он есть.
Подробнее: Для простых страниц без собственного API достаточно HTTP-запросов + HTML-парсера (Python: requests + BeautifulSoup; Node.js: fetch/axios + cheerio). Если для отрисовки страницы нужен JavaScript (многие современные административные интерфейсы), этого уже недостаточно — тогда нужен настоящий (безголовый) браузер, например Playwright или Puppeteer. Страницы, защищённые входом: один раз получите cookie/токен сеанса через форму входа, затем используйте повторно. Если есть официальный API, он почти всегда лучший выбор (стабильнее, нет риска нарушения условий использования) — скрапинг обычно лишь запасной вариант.
Наш контекст: Возник как короткое отступление — общий вопрос о том, как можно автоматически опрашивать собственные устройства/сервисы в домашней сети (роутер, NAS, умный дом) или собственные аккаунты на платформах, независимо от проекта Emzett.
Подробности
Две технические преграды обычно решают, сколько работы потребует проект скрапинга. Первая: статический и динамический HTML. Если сервер сразу отдаёт полный HTML со всем содержимым (просмотр исходного кода показывает тот же текст, что и в браузере), достаточно простого HTTP-запроса. Если страница собирает содержимое только через JavaScript в браузере (просмотр исходного кода показывает лишь пустой каркас), скрапер должен действительно запускать настоящий браузер, чтобы получить готовое содержимое — заметно медленнее и ресурсоёмче.
Вторая: меры против скрапинга. Многие сайты распознают автоматический доступ по таким признакам, как отсутствующие/нетипичные заголовки браузера, слишком регулярные интервалы запросов или отсутствие движений мыши, и блокируют его (часто с помощью CAPTCHA или тихо подсовывая ложные данные). С юридической точки зрения скрапинг находится в серой зоне: чтение общедоступных данных обычно разрешено, но условия использования могут прямо это запрещать, а агрессивный скрапинг (много запросов за короткое время) может расцениваться как атака на мощности сервера — ещё одна причина предпочесть официальный API, если он есть.
import requests
from bs4 import BeautifulSoup
response = requests.get(url, headers={"User-Agent": "..."})
soup = BeautifulSoup(response.text, "html.parser")robots.txt и этикет
Большинство сайтов публикуют по адресу /robots.txt машиночитаемые правила о том, какие области автоматизированные программы (краулеры/скраперы) могут посещать, а какие нет — юридически напрямую не обязывающие, но чёткий сигнал от владельца сайта, который должны соблюдать добросовестные скраперы. К честному скрапингу относятся также: искусственно замедлять запросы (не отправлять десятки параллельных запросов сразу), задавать честный заголовок User-Agent вместо маскировки под обычный браузер и кэшировать, когда данные нужны многократно, вместо того чтобы снова и снова загружать одну и ту же страницу.
Когда стоит использовать настоящий браузер
Playwright/Puppeteer дистанционно управляют настоящим (обычно невидимым, «безголовым») браузером — это делает их заметно медленнее и прожорливее, чем простой HTTP-запрос, но взамен они справляются со страницами, насыщенными JavaScript, входом через настоящие формы и такими взаимодействиями, как прокрутка или клики, которые простой HTML-парсер вообще не воспроизведёт:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto(url)
page.wait_for_selector(".content") # ждать, пока JS отрисует содержимое
html = page.content()