Cào Website Động
Các website động tải nội dung bằng JavaScript sau lần tải trang đầu tiên. Hướng dẫn này chỉ cách thu thập dữ liệu từ các trang web này bằng browser endpoint của FourA.
Vấn đề
Khi bạn gửi một HTTP request tiêu chuẩn đến một website sử dụng nhiều JavaScript, bạn sẽ nhận được khung HTML chứ không phải nội dung thực tế. Dữ liệu bạn cần (danh sách sản phẩm, giá cả, kết quả tìm kiếm) được tải bằng JavaScript sau khi trang hiển thị trong trình duyệt.
Điều này ngày càng phổ biến với các framework hiện đại như React, Vue, Angular và Next.js.
Giải pháp: Browser Request
browser endpoint của FourA (POST /api/browser/) mở URL của bạn trong một phiên bản trình duyệt Chrome để:
- Tải trang
- Thực thi toàn bộ JavaScript
- Đợi nội dung hiển thị
- Trả về HTML đã được hiển thị đầy đủ
Bước 1: Xác định những gì bạn cần
Trước khi thực hiện request, hãy truy cập trang mục tiêu trong trình duyệt của bạn và sử dụng DevTools (F12) để tìm một đoạn văn bản hoặc phần tử xác nhận rằng nội dung đã được tải. Ví dụ:
- Tên sản phẩm xuất hiện sau khi JS hiển thị
- Một class CSS như
product-gridtrong HTML đã hiển thị - Một chuỗi văn bản như "results" chỉ xuất hiện khi dữ liệu được tải
Bước 2: Gửi một 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"
}'
Tùy chọn checkText yêu cầu FourA xác minh rằng chuỗi "product-grid" xuất hiện trong trang đã hiển thị. Nếu nó không xuất hiện trước khi hết thời gian chờ (timeout), request sẽ thất bại, giúp bạn biết rằng nội dung chưa được tải.
Bước 3: Phân tích cú pháp HTML
Response chứa HTML đã hiển thị đầy đủ trong trường body. Phân tích cú pháp nó bằng thư viện ưa thích của bạn:
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());
});
Khắc phục sự cố
Vẫn nhận được nội dung trống?
- Xác minh xem trang thực sự có sử dụng kết xuất JavaScript hay không (kiểm tra bằng "View Source" so với DevTools)
- Tăng
timeout_ms: một số trang tải chậm - Kiểm tra xem trang có yêu cầu xác thực hoặc cookie hay không (sử dụng tham số
cookies)
Gặp trang CAPTCHA?
- Đối với các request đơn lẻ/HTTP, hãy chuyển sang proxy endpoint (
POST /api/proxy/) để tự động xoay vòng IP. - Để thêm xoay vòng proxy vào các browser request, hãy sử dụng tham số
proxycủa browser endpoint thay vì bọc trong proxy endpoint. Proxy endpoint chỉ bọc các request đơn lẻ/HTTP, không bọc các 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", "proxy": "http://proxy-url:port"}'
Các bước tiếp theo
- Chọn đúng Endpoint: Khi nào nên sử dụng browser so với single
- Theo dõi giá của đối thủ cạnh tranh: Hướng dẫn theo dõi giá đầy đủ
- Bảo vệ chống Bot: Xử lý các trang web được bảo vệ