Exemplos Práticos
Exemplos Avançados
Lidando com Sites Dinâmicos e Protegidos (Amazon, Google, Wikipédia).
Nem todos os sites são fáceis. Alguns exigem JavaScript ou têm proteções complexas.
1. Amazon (Bypass de Detecção e Captcha)
A Amazon é famosa por bloquear bots e exibir captchas. Para burlar essas proteções, usamos o @xcrap/puppeteer-extra-client com plugins de Stealth e resolução de captcha.
import { PuppeteerExtraClient } from "@xcrap/puppeteer-extra-client";
import { HtmlExtractionModel, css, extract } from "@xcrap/extractor";
// Plugins para evasão e resolução de captcha
const StealthPlugin = require("puppeteer-extra-plugin-stealth");
const AmazonCaptchaPlugin = require("@mihnea.dev/puppeteer-extra-amazon-captcha");
async function scrapeAmazon() {
const client = new PuppeteerExtraClient({
plugins: [
StealthPlugin(),
AmazonCaptchaPlugin()
]
});
const response = await client.fetch({ url: "https://www.amazon.com/s?k=laptop" });
const productModel = new HtmlExtractionModel({
name: { query: css("h2 span"), extractor: extract("innerText") }
});
const model = new HtmlExtractionModel({
products: {
query: css("[data-component-type='s-search-result']"),
multiple: true,
model: productModel
}
});
const parser = response.asHtmlParser();
const data = await parser.extractModel({ model });
console.log(data);
}2. Google Search (Interação Dinâmica)
O Google pode exigir que você simule um usuário real.
import { PuppeteerRealBrowserClient } from "@xcrap/puppeteer-real-browser-client";
async function searchGoogle() {
const client = new PuppeteerRealBrowserClient();
await client.launch();
const page = await client.newPage();
await page.goto("https://www.google.com");
// O PuppeteerRealBrowser lida com os desafios de bot internamente
await page.type("textarea", "Xcrap framework");
await page.keyboard.press("Enter");
await page.waitForSelector("#search");
const html = await page.content();
// Agora você pode usar o HtmlParser com o HTML obtido
client.close();
}3. Wikipédia (Dados Estruturados JSON)
Muitas APIs internas da Wikipédia retornam JSON. O Xcrap também suporta extração de JSON!
import { AxiosClient } from "@xcrap/axios-client";
import { JsonParser, JsonExtractionModel } from "@xcrap/extractor";
async function wikipediaInfo() {
const client = new AxiosClient();
const response = await client.fetch({ url: "https://en.wikipedia.org/w/api.php?action=query&format=json&titles=Main_Page" });
// No JSON, a query é o caminho das chaves
const model = new JsonExtractionModel({
pageId: {
query: "query.pages.-1.pageid",
extractor: (val) => val // Extrator simples
}
});
const parser = response.asJsonParser();
const result = await parser.extractModel({ model });
console.log(result);
}