Скрапване на динамичен сайт

Динамичните уебсайтове зареждат съдържание чрез JavaScript след първоначалното зареждане на страницата. Това ръководство показва как да събирате данни от тези сайтове чрез browser endpoint на FourA.

Проблемът

Когато изпратите стандартна HTTP request към уебсайт с интензивно използване на JavaScript, получавате базовата HTML структура, но не и реалното съдържание. Данните, от които се нуждаете (списъци с продукти, цени, резултати от търсене), се зареждат от JavaScript след рендиране на страницата в браузър.

Това се среща все по-често при модерни frameworks като React, Vue, Angular и Next.js.

Решението: Browser Requests

Браузърният endpoint на FourA (POST /api/browser/) отваря вашия URL в Chrome браузър инстанция, която:

  1. Зарежда страницата
  2. Изпълнява целия JavaScript
  3. Изчаква съдържанието да се рендира
  4. Връща напълно рендирания HTML

Стъпка 1: Идентифицирайте какво ви е необходимо

Преди да направите request, посетете целевата страница в браузъра си и използвайте DevTools (F12), за да откриете текст или елемент, който потвърждава, че съдържанието е заредено. Например:

  • Име на продукт, което се появява след JS рендиране
  • CSS клас като product-grid в рендирания HTML
  • Текстов низ като "results", който се появява само при зареждане на данните

Стъпка 2: Изпратете Browser Request

curl -X POST https://eu.api.foura.ai/api/browser/ \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/products",
    "timeout_ms": 15000,
    "checkText": "product-grid"
  }'

Опцията checkText указва на FourA да провери дали "product-grid" присъства в страницата, след като тя приключи зареждането си. Ако не присъства, request се връща като неуспешен с checkText:product-grid not found, а неуспешните request не се таксуват. checkText не кара FourA да чака текста по-дълго.

Стъпка 3: Парсиране на HTML

Response съдържа напълно рендирания HTML в полето body. Парсирайте го с предпочитаната от вас библиотека:

Python (BeautifulSoup)

import requests
from bs4 import BeautifulSoup

resp = requests.post("https://eu.api.foura.ai/api/browser/", headers={
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json"
}, json={
    "url": "https://example.com/products",
    "timeout_ms": 15000,
    "checkText": "product-grid"
})

html = resp.json()["body"]
soup = BeautifulSoup(html, "html.parser")

for product in soup.select(".product-card"):
    name = product.select_one(".product-name").text.strip()
    price = product.select_one(".product-price").text.strip()
    print(f"{name}: {price}")

Node.js (cheerio)

import * as cheerio from 'cheerio';

const resp = await fetch('https://eu.api.foura.ai/api/browser/', {
  method: 'POST',
  headers: { 'X-API-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    url: 'https://example.com/products',
    timeout_ms: 15000,
    checkText: 'product-grid'
  })
});

const { body: html } = await resp.json();
const $ = cheerio.load(html);

$('.product-card').each((i, el) => {
  console.log($(el).find('.product-name').text(), $(el).find('.product-price').text());
});

Отстраняване на неизправности

Все още получавате празно съдържание?

  • Проверете дали страницата действително използва JavaScript рендиране (сравнете с "View Source" спрямо DevTools)
  • Увеличете timeout_ms: някои страници се зареждат бавно
  • Проверете дали страницата изисква автентикация или cookies (използвайте параметъра cookies)

Получавате страница за верификация?

  • За единични/HTTP заявки преминете към proxy endpoint (POST /api/proxy/) за автоматична ротация на IP адреси.
  • За да пренасочите browser заявка през proxy, подайте параметъра proxy на browser endpoint. Proxy endpoint обработва само единични/HTTP заявки, не и browser заявки.

Параметърът proxy приема непрозрачния proxy ID, върнат от предишен response, а не ваш собствен proxy адрес. Изпълнете първо едно извикване на POST /api/proxy/ (или POST /api/auto/), прочетете върнатото поле proxy, след което го фиксирайте:

# Step 1: let FourA find a working exit. The response carries "proxy": "A1B2C3".
curl -X POST "https://eu.api.foura.ai/api/proxy/" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"maxTries": 5, "request": {"method": "GET", "url": "https://example.com/products"}}'

# Step 2: render through that same exit.
curl -X POST "https://eu.api.foura.ai/api/browser/" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/products", "proxy": "A1B2C3", "timeout_ms": 20000}'

Изпращането на адрес вместо ID връща 400 Invalid proxy format. Пълният модел е описан в Повторно използване на proxy при множество заявки.

Следващи стъпки

Обновено: 27 септември 2026 г.