Скрапване на динамичен сайт
Динамичните уебсайтове зареждат съдържание чрез JavaScript след първоначалното зареждане на страницата. Това ръководство показва как да събирате данни от тези сайтове с помощта на browser endpoint на FourA.
Проблемът
Когато изпратите стандартен HTTP request до уебсайт, който разчита силно на JavaScript, получавате HTML обвивката, но не и действителното съдържание. Данните, които ви трябват (списъци с продукти, цени, резултати от търсене), се зареждат от JavaScript, след като страницата се рендира в браузъра.
Това е все по-често срещано при съвременните фреймуърци като React, Vue, Angular и Next.js.
Решението: Browser requests
Browser endpoint на FourA (POST /api/browser/) отваря вашия URL адрес в инстанция на браузъра Chrome, която:
- Зарежда страницата
- Изпълнява целия JavaScript
- Изчаква рендирането на съдържанието
- Връща напълно рендирания 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" се появява в рендираната страница. Ако не се появи преди изтичане на времето за изчакване, заявката е неуспешна, което ви уведомява, че съдържанието не се е заредило.
Стъпка 3: Парсиране на HTML
Отговорът съдържа напълно рендирания 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)
Получавате CAPTCHA страница?
- За единични/HTTP заявки преминете към proxy endpoint-а (
POST /api/proxy/) за автоматична ротация на IP. - За да маршрутизирате браузър заявка през proxy, подайте параметъра
proxyна браузър endpoint-а. Proxy endpoint-ът обгръща само единични/HTTP заявки, не и браузър заявки.
Параметърът 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 в заявки.
Следващи стъпки
- Избор на правилния endpoint: Кога да използвате browser вместо single
- Мониторинг на цени на конкуренти: Пълно ръководство за проследяване на цени
- Anti-Bot защита: Работа със защитени сайтове
- Многократно използване на proxy в заявки: Фиксиране на един изход за целия работен процес