EMZETT.
Увійти

Веб-скрапінг

Коротко: Автоматичне видобування даних із сайтів за допомогою скрипта — або із сирого 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()

Див. також: HTML, API, Браузер