Буває, що парсер отримує порожню сторінку, хоча в браузері товари видно. Причина — динамічне завантаження: дані підтягуються скриптами вже після відкриття сторінки, і в початковому 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 або парсинг сайтів під ключ.