Node.js, I/O-heavy iş yüklerini kazıma konusunda üstündür. Hedef siteler CAPTCHA'lar sunduğunda, CaptchaAI'nin API'si bunları çözerken, komut dosyanız HTTP isteklerini yönetir. Bu eğitim, axios ve Cheerio'yu kullanarak iş akışının tamamını kapsar.
Gereksinimler
| Gereksinim | Ayrıntılar |
|---|---|
| Node.js 16+ | npm ile |
| eksenler | npm install axios |
| tezahürat | npm install cheerio |
| CaptchaAI API anahtarı | İtibarencaptchaai.com |
CaptchaAI Çözücü Modülü
// captcha-solver.js
const axios = require("axios");
class CaptchaSolver {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseUrl = "https://ocr.captchaai.com";
}
async _submit(params) {
params.key = this.apiKey;
const resp = await axios.get(`${this.baseUrl}/in.php`, { params });
if (!resp.data.startsWith("OK|")) {
throw new Error(`Submit error: ${resp.data}`);
}
return resp.data.split("|")[1];
}
async _poll(taskId, timeout = 300000) {
const deadline = Date.now() + timeout;
while (Date.now() < deadline) {
await new Promise((r) => setTimeout(r, 5000));
const resp = await axios.get(`${this.baseUrl}/res.php`, {
params: { key: this.apiKey, action: "get", id: taskId },
});
if (resp.data === "CAPCHA_NOT_READY") continue;
if (resp.data.startsWith("OK|")) return resp.data.split("|")[1];
throw new Error(`Solve error: ${resp.data}`);
}
throw new Error("Solve timed out");
}
async solveRecaptchaV2(siteKey, pageUrl) {
const taskId = await this._submit({
method: "userrecaptcha",
googlekey: siteKey,
pageurl: pageUrl,
});
return this._poll(taskId);
}
async solveRecaptchaV3(siteKey, pageUrl, action = "verify") {
const taskId = await this._submit({
method: "userrecaptcha",
googlekey: siteKey,
pageurl: pageUrl,
version: "v3",
action,
});
return this._poll(taskId);
}
async solveTurnstile(siteKey, pageUrl) {
const taskId = await this._submit({
method: "turnstile",
sitekey: siteKey,
pageurl: pageUrl,
});
return this._poll(taskId);
}
}
module.exports = CaptchaSolver;
reCAPTCHA Korumalı Sayfayı Kazıma
const axios = require("axios");
const cheerio = require("cheerio");
const CaptchaSolver = require("./captcha-solver");
const solver = new CaptchaSolver("YOUR_API_KEY");
async function scrapeProtectedPage(url) {
// Step 1: Load the page
const { data: html } = await axios.get(url, {
headers: {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
},
});
const $ = cheerio.load(html);
// Step 2: Extract site key
const siteKey = $(".g-recaptcha").attr("data-sitekey");
if (!siteKey) {
console.log("No CAPTCHA found, page loaded directly");
return html;
}
console.log("Site key found:", siteKey);
// Step 3: Solve the CAPTCHA
const token = await solver.solveRecaptchaV2(siteKey, url);
console.log("Token received:", token.substring(0, 50));
// Step 4: Submit with the token
const result = await axios.post(
url,
new URLSearchParams({
"g-recaptcha-response": token,
q: "search query",
}),
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
},
}
);
return result.data;
}
Aynı Anda Birden Fazla Sayfayı Kazımak
async function scrapePages(urls, siteKey, concurrency = 3) {
const results = [];
const queue = [...urls];
const worker = async () => {
while (queue.length > 0) {
const url = queue.shift();
try {
const token = await solver.solveRecaptchaV2(siteKey, url);
const { data } = await axios.post(
url,
new URLSearchParams({ "g-recaptcha-response": token }),
{
headers: {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
},
}
);
results.push({ url, data, success: true });
console.log(`Scraped: ${url}`);
} catch (err) {
results.push({ url, error: err.message, success: false });
console.error(`Failed: ${url} - ${err.message}`);
}
}
};
// Run workers concurrently
const workers = Array(concurrency)
.fill(null)
.map(() => worker());
await Promise.all(workers);
return results;
}
// Usage
const urls = [
"https://example.com/page/1",
"https://example.com/page/2",
"https://example.com/page/3",
];
const results = await scrapePages(urls, "6Le-wvkS...", 3);
Çerezleri ve Oturumları Yönetme
Oturum çerezleri gerektiren siteler için çerez kalıcılığı olan axios'u kullanın:
const { wrapper } = require("axios-cookiejar-support");
const { CookieJar } = require("tough-cookie");
const jar = new CookieJar();
const client = wrapper(
axios.create({
jar,
headers: {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
},
})
);
async function scrapeWithSession(url, siteKey) {
// Initial page load sets cookies
await client.get(url);
// Solve CAPTCHA
const token = await solver.solveRecaptchaV2(siteKey, url);
// Submit with maintained cookies
const result = await client.post(
url,
new URLSearchParams({ "g-recaptcha-response": token })
);
return result.data;
}
Sonuçları Cheerio ile Ayrıştırma
function parseResults(html) {
const $ = cheerio.load(html);
const items = [];
$(".result-item").each((_, el) => {
items.push({
title: $(el).find(".title").text().trim(),
url: $(el).find("a").attr("href"),
description: $(el).find(".description").text().trim(),
});
});
return items;
}
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
CAPTCHA_NOT_READY süresiz olarak döngüye giriyor |
Yanlış site anahtarı veya yavaş çözüm | Site anahtarını doğrulayın; zaman aşımını artır |
POST'ta 403 Forbidden |
Eksik çerezler veya başlıklar | Oturum çerezlerini kullanın; Referer başlığı ekle |
| Cheerio öğeleri bulamıyor | Dinamik içerik | JS ile oluşturulan siteler için Puppeteer'ı kullanın |
ECONNREFUSED |
Oran hedef siteye göre sınırlı | Gecikmeler ekleyin; proxy'leri döndür |
SSS
Axios yerine Puppeteer'ı ne zaman kullanmalıyım?
Hedef site standart form gönderimleriyle HTML döndürdüğünde axios + Cheerio'yu kullanın. Site JavaScript yürütme, dinamik oluşturma veya karmaşık kullanıcı etkileşimleri gerektirdiğinde Puppeteer'ı kullanın.
Aynı anda birden fazla CAPTCHA çözebilir miyim?
Evet. Birden fazla CAPTCHA görevini aynı anda CaptchaAI'ye gönderin ve her sonuç için anket yapın. Yukarıdaki eş zamanlı kazıma örneği bu modeli göstermektedir.
Cloudflare korumalı siteleri nasıl yönetirim?
Site Turnstile kullanıyorsa solver.solveTurnstile() kullanın. Cloudflare meydan okuma sayfalarının tamamı için şunu kullanın:Cloudflare doğrulama akışı çözmeqa_session_cookie çerezlerini döndüren.