Скрапване на динамичен сайт
Динамичните уебсайтове зареждат съдържание чрез JavaScript след първоначалното зареждане на страницата. Това ръководство показва как да събирате данни от тези сайтове чрез browser endpoint на FourA.
Проблемът
Когато изпратите стандартна HTTP request към уебсайт с интензивно използване на JavaScript, получавате базовата HTML структура, но не и реалното съдържание. Данните, от които се нуждаете (списъци с продукти, цени, резултати от търсене), се зареждат от JavaScript след рендиране на страницата в браузър.
Това се среща все по-често при модерни frameworks като React, Vue, Angular и Next.js.
Решението: Browser Requests
Браузърният 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" присъства в страницата, след като тя приключи зареждането си. Ако не присъства, 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 при множество заявки.
Следващи стъпки
- Избор на правилния endpoint: Кога да използвате browser спрямо single
- Мониторинг на цени на конкуренти: Пълно ръководство за проследяване на цени
- Защитени сайтове: Справяне със защитени сайтове
- Повторно използване на proxy при множество заявки: Фиксиране на една изходна точка за цял работен процес