Написати в Телеграм Написати у Вайбер Зателефонувати

Буває, що парсер отримує порожню сторінку, хоча в браузері товари видно. Причина — динамічне завантаження: дані підтягуються скриптами вже після відкриття сторінки, і в початковому HTML їх немає. Розбираємо, як із цим працювати на Python.

Як зрозуміти, що сторінка динамічна

  • У «Перегляді коду сторінки» (Ctrl+U) немає потрібного тексту, хоча в браузері він є.
  • Контент з’являється після прокрутки або натискання кнопки «Показати ще».
  • У відповіді requests лише порожній контейнер, наприклад <div id="app"></div>.

Спосіб 1. Знайти прихований запит до API

Найшвидший шлях: відкрийте DevTools (F12) → вкладка Network → фільтр Fetch/XHR і перезавантажте сторінку. Часто дані приходять окремим запитом у форматі JSON. Його можна відтворити звичайним requests: це швидше й дешевше, ніж запускати браузер.

import requests

r = requests.get("https://example.com/api/products?page=1",
                 headers={"User-Agent": "Mozilla/5.0"}, timeout=20)
data = r.json()
for item in data["items"]:
    print(item["name"], item["price"])

Спосіб 2. Selenium

Selenium керує справжнім браузером, тому бачить сторінку після виконання скриптів.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com/catalog")

WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".product-card"))
)

for card in driver.find_elements(By.CSS_SELECTOR, ".product-card"):
    print(card.find_element(By.CSS_SELECTOR, ".title").text)

driver.quit()

Обов’язково використовуйте явні очікування (WebDriverWait), а не фіксовані паузи: так парсер не спрацює раніше, ніж дані з’являться.

Спосіб 3. Playwright

Сучасна альтернатива Selenium: швидша, зручніша в налаштуванні й з вбудованими очікуваннями.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com/catalog")
    page.wait_for_selector(".product-card")
    titles = page.locator(".product-card .title").all_inner_texts()
    browser.close()

print(titles)

Перед першим запуском виконайте pip install playwright і playwright install chromium.

Нескінченна прокрутка і кнопка «Показати ще»

У Selenium або Playwright прокручуйте сторінку в циклі й перевіряйте, чи збільшилась кількість елементів. Коли нових немає — зупиняйтесь. Для кнопки «Показати ще» натискайте її, поки вона не зникне.

Поради для стабільної роботи

  • Спершу шукайте JSON-запит: браузер потрібен лише там, де інакше не вийде.
  • Режим headless швидший, але деякі сайти його розпізнають. Тоді допомагають реальний User-Agent і розміри вікна.
  • Не запускайте десятки вікон одночасно: це навантажує і ваш комп’ютер, і чужий сайт.
  • Закривайте браузер у блоці finally, щоб не залишати фонові процеси.

Базові приклади зі статичними сторінками дивіться у статті парсинг на Python з BeautifulSoup.

Складний сайт із захистом або динамікою? Розробимо рішення під вас: замовити парсер на Python або парсинг сайтів під ключ.