Cara menyelesaikan Captcha di Crawlee dengan Integrasi CapSolver

Adélia Cruz
Neural Network Developer
24-Dec-2025
TL;DR: Crawler Crawlee sering kali menghadapi penghalang CAPTCHA. Mengintegrasikan CapSolver memungkinkan Anda menyelesaikan reCAPTCHA, Turnstile, dan lainnya, sehingga alur kerja scraping tetap stabil dan otomatis.

Saat membangun crawler dengan Crawlee, menghadapi CAPTCHA hampir tidak terhindarkan—terutama di situs modern dengan perlindungan bot yang agresif. Bahkan crawler Playwright atau HTTP yang sudah dikonfigurasi dengan baik bisa terblokir saat tantangan reCAPTCHA, Turnstile, atau serupa muncul.
Panduan ini fokus pada pendekatan praktis: menggunakan CapSolver untuk menyelesaikan tantangan CAPTCHA secara langsung dalam alur kerja Crawlee. Alih-alih terus-menerus melawan fingerprint browser, Anda akan melihat cara mendeteksi jenis CAPTCHA umum, menyelesaikannya secara programatik, dan menjaga crawler Anda berjalan secara andal dalam skenario scraping dunia nyata.
Apa itu Crawlee?
Crawlee adalah perpustakaan scraping web dan otomasi browser untuk Node.js yang dirancang untuk membangun crawler yang andal dan terlihat seperti manusia, serta melewati radar perlindungan bot modern. Dibangun dengan TypeScript, perpustakaan ini menyediakan antarmuka yang sederhana namun fleksibel untuk penggunaan tingkat tinggi dan tingkat rendah.
Fitur Utama Crawlee
- Antarmuka Terpadu: API tunggal untuk crawling HTTP dan browser headless
- Stealth Anti-Bot: Pembuatan fingerprint browser otomatis, replikasi fingerprint TLS, dan perilaku yang menyerupai manusia
- Manajemen Antrian Cerdas: Antrian URL yang tetap stabil dengan opsi crawling breadth-first dan depth-first
- Pengaturan Otomatis: Penyesuaian sumber daya otomatis berdasarkan beban sistem
- Rotasi Proxy: Rotasi proxy dan manajemen sesi yang terintegrasi
- Dukungan Browser Beragam: Bekerja dengan Playwright dan Puppeteer di Chrome, Firefox, dan WebKit
Tipe Crawler
Crawlee menawarkan berbagai tipe crawler untuk berbagai kebutuhan:
| Tipe Crawler | Deskripsi |
|---|---|
| CheerioCrawler | Crawler HTTP ultra-cepat menggunakan Cheerio untuk parsing HTML |
| PlaywrightCrawler | Otomasi browser lengkap dengan Playwright untuk situs yang berbasis JavaScript |
| PuppeteerCrawler | Otomasi browser lengkap dengan Puppeteer untuk rendering JavaScript |
| JSDOMCrawler | Crawler HTTP dengan JSDOM untuk eksekusi JavaScript tanpa browser |
Apa itu CapSolver?
CapSolver adalah layanan penyelesaian CAPTCHA yang terkemuka yang menyediakan solusi berbasis AI untuk melewati berbagai tantangan CAPTCHA. Dengan dukungan untuk berbagai jenis CAPTCHA dan waktu respons yang cepat, CapSolver dapat terintegrasi secara mulus ke dalam alur kerja otomatis.
Jenis CAPTCHA yang Didukung
- reCAPTCHA v2 (Gambar & Tidak Terlihat)
- reCAPTCHA v3
- Cloudflare Turnstile
- AWS WAF
- Dan banyak lagi...
Mengapa Mengintegrasikan CapSolver dengan Crawlee?
Saat membangun crawler Crawlee yang berinteraksi dengan situs yang dilindungi, tantangan CAPTCHA bisa menghentikan seluruh alur scraping Anda. Berikut alasan mengapa integrasi ini penting:
- Crawling yang Tidak Terputus: Crawler terus mengekstrak data tanpa intervensi manual
- Operasi yang Dapat Diperluas: Menangani berbagai tantangan CAPTCHA di sesi crawling yang bersamaan
- Biaya Efisien: Bayar hanya untuk CAPTCHA yang berhasil diselesaikan
- Tingkat Keberhasilan Tinggi: Akurasi terbaik di industri untuk semua jenis CAPTCHA yang didukung
Instalasi
Pertama, instal paket yang diperlukan:
bash
npm install crawlee playwright axios
Atau dengan yarn:
bash
yarn add crawlee playwright axios
Membuat Utilitas CapSolver untuk Crawlee
Berikut adalah kelas utilitas CapSolver yang dapat digunakan kembali dan bisa diterapkan di berbagai proyek Crawlee Anda:
Layanan Dasar CapSolver
typescript
import axios from 'axios';
const CAPSOLVER_API_KEY = 'API_KEY_CAPSOLVER_ANDA';
interface TaskResult {
status: string;
solution?: {
gRecaptchaResponse?: string;
token?: string;
};
errorDescription?: string;
}
class CapSolverService {
private apiKey: string;
private baseUrl = 'https://api.capsolver.com';
constructor(apiKey: string = CAPSOLVER_API_KEY) {
this.apiKey = apiKey;
}
async createTask(taskData: object): Promise<string> {
const response = await axios.post(`${this.baseUrl}/createTask`, {
clientKey: this.apiKey,
task: taskData
});
if (response.data.errorId !== 0) {
throw new Error(`Kesalahan CapSolver: ${response.data.errorDescription}`);
}
return response.data.taskId;
}
async getTaskResult(taskId: string, maxAttempts = 60): Promise<TaskResult> {
for (let i = 0; i < maxAttempts; i++) {
await this.sleep(2000);
const response = await axios.post(`${this.baseUrl}/getTaskResult`, {
clientKey: this.apiKey,
taskId
});
if (response.data.status === 'ready') {
return response.data;
}
if (response.data.status === 'failed') {
throw new Error(`Tugas gagal: ${response.data.errorDescription}`);
}
}
throw new Error('Waktu tunggu solusi CAPTCHA habis');
}
private sleep(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms));
}
async solveReCaptchaV2(websiteUrl: string, websiteKey: string): Promise<string> {
const taskId = await this.createTask({
type: 'ReCaptchaV2TaskProxyLess',
websiteURL: websiteUrl,
websiteKey
});
const result = await this.getTaskResult(taskId);
return result.solution?.gRecaptchaResponse || '';
}
async solveReCaptchaV3(
websiteUrl: string,
websiteKey: string,
pageAction = 'submit'
): Promise<string> {
const taskId = await this.createTask({
type: 'ReCaptchaV3TaskProxyLess',
websiteURL: websiteUrl,
websiteKey,
pageAction
});
const result = await this.getTaskResult(taskId);
return result.solution?.gRecaptchaResponse || '';
}
async solveTurnstile(websiteUrl: string, websiteKey: string): Promise<string> {
const taskId = await this.createTask({
type: 'AntiTurnstileTaskProxyLess',
websiteURL: websiteUrl,
websiteKey
});
const result = await this.getTaskResult(taskId);
return result.solution?.token || '';
}
}
export const capSolver = new CapSolverService();
Menyelesaikan Berbagai Jenis CAPTCHA dengan Crawlee
reCAPTCHA v2 dengan PlaywrightCrawler
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
const RECAPTCHA_SITE_KEY = 'KUNCI_SITUS_ANDA';
const crawler = new PlaywrightCrawler({
async requestHandler({ page, request, log }) {
log.info(`Memproses ${request.url}`);
// Periksa apakah halaman memiliki reCAPTCHA
const hasRecaptcha = await page.$('.g-recaptcha');
if (hasRecaptcha) {
log.info('reCAPTCHA terdeteksi, menyelesaikan...');
// Dapatkan kunci situs dari halaman
const siteKey = await page.$eval(
'.g-recaptcha',
(el) => el.getAttribute('data-sitekey')
) || RECAPTCHA_SITE_KEY;
// Selesaikan CAPTCHA
const token = await capSolver.solveReCaptchaV2(request.url, siteKey);
// Sisipkan token - textarea tersembunyi, jadi kita gunakan JavaScript
await page.$eval('#g-recaptcha-response', (el: HTMLTextAreaElement, token: string) => {
el.style.display = 'block';
el.value = token;
}, token);
// Kirim formulir
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
log.info('reCAPTCHA berhasil diselesaikan!');
}
// Ekstrak data setelah CAPTCHA diselesaikan
const title = await page.title();
const content = await page.locator('body').innerText();
await Dataset.pushData({
title,
content: content.slice(0, 1000)
});
},
maxRequestsPerCrawl: 50,
headless: true
});
await crawler.run(['https://example.com/halaman-terlindungi']);
reCAPTCHA v3 dengan PlaywrightCrawler
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
const crawler = new PlaywrightCrawler({
async requestHandler({ page, request, log }) {
log.info(`Memproses ${request.url}`);
// reCAPTCHA v3 tidak terlihat, deteksi melalui skrip
const recaptchaScript = await page.$('script[src*="recaptcha/api.js?render="]');
if (recaptchaScript) {
log.info('reCAPTCHA v3 terdeteksi, menyelesaikan...');
// Ekstrak kunci situs dari src skrip
const scriptSrc = await recaptchaScript.getAttribute('src') || '';
const siteKeyMatch = scriptSrc.match(/render=([^&]+)/);
const siteKey = siteKeyMatch ? siteKeyMatch[1] : '';
if (siteKey) {
// Selesaikan reCAPTCHA v3
const token = await capSolver.solveReCaptchaV3(
request.url,
siteKey,
'submit'
);
// Sisipkan token ke input tersembunyi menggunakan JavaScript
await page.$eval('input[name="g-recaptcha-response"]', (el: HTMLInputElement, token: string) => {
el.value = token;
}, token);
log.info('Token reCAPTCHA v3 berhasil disisipkan!');
}
}
// Lanjutkan dengan pengiriman formulir atau ekstraksi data
const title = await page.title();
const url = page.url();
await Dataset.pushData({ title, url });
}
});
await crawler.run(['https://example.com/v3-terlindungi']);
Cloudflare Turnstile dengan PlaywrightCrawler
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
const crawler = new PlaywrightCrawler({
async requestHandler({ page, request, log }) {
log.info(`Memproses ${request.url}`);
// Periksa widget Turnstile
const hasTurnstile = await page.$('.cf-turnstile');
if (hasTurnstile) {
log.info('Cloudflare Turnstile terdeteksi, menyelesaikan...');
// Dapatkan kunci situs
const siteKey = await page.$eval(
'.cf-turnstile',
(el) => el.getAttribute('data-sitekey')
);
if (siteKey) {
// Selesaikan Turnstile
const token = await capSolver.solveTurnstile(request.url, siteKey);
// Sisipkan token menggunakan JavaScript (input tersembunyi)
await page.$eval('input[name="cf-turnstile-response"]', (el: HTMLInputElement, token: string) => {
el.value = token;
}, token);
// Kirim formulir
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
log.info('Turnstile berhasil diselesaikan!');
}
}
// Ekstrak data
const title = await page.title();
const content = await page.locator('body').innerText();
await Dataset.pushData({
title,
content: content.slice(0, 500)
});
}
});
await crawler.run(['https://example.com/terlindungi-turnstile']);
Integrasi Lanjutan: Mendeteksi CAPTCHA Otomatis
Berikut adalah crawler lanjutan yang secara otomatis mendeteksi dan menyelesaikan berbagai jenis CAPTCHA:
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
interface CaptchaInfo {
type: 'recaptcha-v2' | 'recaptcha-v3' | 'turnstile' | 'none';
siteKey: string | null;
}
async function detectCaptcha(page: any): Promise<CaptchaInfo> {
// Periksa reCAPTCHA v2
const recaptchaV2 = await page.$('.g-recaptcha');
if (recaptchaV2) {
const siteKey = await page.$eval('.g-recaptcha', (el: Element) =>
el.getAttribute('data-sitekey')
);
return { type: 'recaptcha-v2', siteKey };
}
// Periksa reCAPTCHA v3
const recaptchaV3Script = await page.$('script[src*="recaptcha/api.js?render="]');
if (recaptchaV3Script) {
const scriptSrc = await recaptchaV3Script.getAttribute('src') || '';
const match = scriptSrc.match(/render=([^&]+)/);
const siteKey = match ? match[1] : null;
return { type: 'recaptcha-v3', siteKey };
}
// Periksa Turnstile
const turnstile = await page.$('.cf-turnstile');
if (turnstile) {
const siteKey = await page.$eval('.cf-turnstile', (el: Element) =>
el.getAttribute('data-sitekey')
);
return { type: 'turnstile', siteKey };
}
return { type: 'none', siteKey: null };
}
async function solveCaptcha(
page: any,
url: string,
captchaInfo: CaptchaInfo
): Promise<void> {
if (!captchaInfo.siteKey || captchaInfo.type === 'none') return;
let token: string;
switch (captchaInfo.type) {
case 'recaptcha-v2':
token = await capSolver.solveReCaptchaV2(url, captchaInfo.siteKey);
// Textarea tersembunyi - gunakan JavaScript untuk mengatur nilai
await page.$eval('#g-recaptcha-response', (el: HTMLTextAreaElement, t: string) => {
el.style.display = 'block';
el.value = t;
}, token);
break;
case 'recaptcha-v3':
token = await capSolver.solveReCaptchaV3(url, captchaInfo.siteKey);
// Input tersembunyi - gunakan JavaScript untuk mengatur nilai
await page.$eval('input[name="g-recaptcha-response"]', (el: HTMLInputElement, t: string) => {
el.value = t;
}, token);
break;
case 'turnstile':
token = await capSolver.solveTurnstile(url, captchaInfo.siteKey);
// Input tersembunyi - gunakan JavaScript untuk mengatur nilai
await page.$eval('input[name="cf-turnstile-response"]', (el: HTMLInputElement, t: string) => {
el.value = t;
}, token);
break;
}
}
const crawler = new PlaywrightCrawler({
async requestHandler({ page, request, log, enqueueLinks }) {
log.info(`Memproses ${request.url}`);
// Deteksi CAPTCHA otomatis
const captchaInfo = await detectCaptcha(page);
if (captchaInfo.type !== 'none') {
log.info(`Deteksi ${captchaInfo.type}, menyelesaikan...`);
await solveCaptcha(page, request.url, captchaInfo);
// Kirim formulir jika ada
const submitBtn = await page.$('button[type="submit"], input[type="submit"]');
if (submitBtn) {
await submitBtn.click();
await page.waitForLoadState('networkidle');
}
log.info('CAPTCHA berhasil diselesaikan!');
}
// Ekstrak data
const title = await page.title();
const url = page.url();
const text = await page.locator('body').innerText();
await Dataset.pushData({
title,
url,
text: text.slice(0, 1000)
});
// Lanjutkan pencrawlan
await enqueueLinks();
},
maxRequestsPerCrawl: 100
});
await crawler.run(['https://example.com']);
Cara Mengirim Token CAPTCHA
Setiap jenis CAPTCHA memerlukan metode pengiriman yang berbeda dalam konteks browser:
reCAPTCHA v2/v3 - Injeksi Token
typescript
async function submitRecaptchaToken(page: any, token: string): Promise<void> {
// Textarea respons tersembunyi - gunakan JavaScript untuk mengatur nilai
await page.$eval('#g-recaptcha-response', (el: HTMLTextAreaElement, token: string) => {
el.style.display = 'block';
el.value = token;
}, token);
// Juga atur input tersembunyi jika ada (umum dalam implementasi kustom)
try {
await page.$eval('input[name="g-recaptcha-response"]', (el: HTMLInputElement, token: string) => {
el.value = token;
}, token);
} catch (e) {
// Input mungkin tidak ada
}
// Kirim formulir
await page.click('form button[type="submit"]');
}
Turnstile - Injeksi Token
typescript
async function submitTurnstileToken(page: any, token: string): Promise<void> {
// Atur token di input tersembunyi menggunakan JavaScript
await page.$eval('input[name="cf-turnstile-response"]', (el: HTMLInputElement, token: string) => {
el.value = token;
}, token);
// Kirim formulir
await page.click('form button[type="submit"]');
}
Menggunakan Ekstensi CapSolver dengan Crawlee
Untuk skenario di mana Anda ingin penyelesaian CAPTCHA otomatis, Anda dapat memuat ekstensi CapSolver:
typescript
import { PlaywrightCrawler } from 'crawlee';
import path from 'path';
const crawler = new PlaywrightCrawler({
launchContext: {
launchOptions: {
// Muat ekstensi CapSolver
args: [
`--disable-extensions-except=${path.resolve('./capsolver-extension')}`,
`--load-extension=${path.resolve('./capsolver-extension')}`
],
headless: false // Ekstensi memerlukan mode yang tidak headless
}
},
async requestHandler({ page, request, log }) {
log.info(`Memproses ${request.url}`);
// Ekstensi akan secara otomatis menyelesaikan CAPTCHA
// Tunggu CAPTCHA yang mungkin diselesaikan
await page.waitForTimeout(5000);
// Lanjutkan dengan scraping
const title = await page.title();
const content = await page.locator('body').innerText();
console.log({ title, content });
}
});
await crawler.run(['https://example.com/captcha-page']);
Praktik Terbaik
1. Penanganan Kesalahan dengan Pengulangan
typescript
async function solveWithRetry(
solverFn: () => Promise<string>,
maxRetries = 3
): Promise<string> {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await solverFn();
} catch (error) {
if (attempt === maxRetries - 1) throw error;
const delay = Math.pow(2, attempt) * 1000; // Backoff eksponensial
await new Promise(resolve => setTimeout(resolve, delay));
}
}
throw new Error('Jumlah pengulangan maksimum tercapai');
}
// Penggunaan
const token = await solveWithRetry(() =>
capSolver.solveReCaptchaV2(url, siteKey)
);
2. Manajemen Saldo
typescript
import axios from 'axios';
async function checkBalance(apiKey: string): Promise<number> {
const response = await axios.post('https://api.capsolver.com/getBalance', {
clientKey: apiKey
});
return response.data.balance || 0;
}
// Periksa sebelum memulai crawler
const balance = await checkBalance(CAPSOLVER_API_KEY);
if (balance < 1) {
console.warn('Saldo CapSolver rendah! Silakan isi ulang.');
}
3. Manajemen Sesi untuk Banyak Halaman
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
// Simpan token yang telah diselesaikan untuk kombinasi domain/kunci yang sama
const tokenCache = new Map<string, { token: string; timestamp: number }>();
const TOKEN_TTL = 90000; // 90 detik
async function getCachedToken(
url: string,
siteKey: string,
solverFn: () => Promise<string>
): Promise<string> {
const cacheKey = `${new URL(url).hostname}:${siteKey}`;
const cached = tokenCache.get(cacheKey);
if (cached && Date.now() - cached.timestamp < TOKEN_TTL) {
return cached.token;
}
const token = await solverFn();
tokenCache.set(cacheKey, { token, timestamp: Date.now() });
return token;
}
4. Integrasi Proxy
typescript
import { PlaywrightCrawler, ProxyConfiguration } from 'crawlee';
const proxyConfiguration = new ProxyConfiguration({
proxyUrls: [
'http://user:[email protected]:8080',
'http://user:[email protected]:8080',
'http://user:[email protected]:8080'
]
});
const crawler = new PlaywrightCrawler({
proxyConfiguration,
async requestHandler({ page, request, log, proxyInfo }) {
log.info(`Menggunakan proxy: ${proxyInfo?.url}`);
// Logika penyelesaian CAPTCHA dan scraping Anda di sini
}
});
Contoh Lengkap: Penjelajah E-commerce dengan Penanganan CAPTCHA
typescript
import { PlaywrightCrawler, Dataset, ProxyConfiguration } from 'crawlee';
import { capSolver } from './capsolver-service';
interface Product {
name: string;
price: string;
url: string;
image: string;
}
const proxyConfiguration = new ProxyConfiguration({
proxyUrls: ['http://user:[email protected]:8080']
});
const crawler = new PlaywrightCrawler({
proxyConfiguration,
maxRequestsPerCrawl: 200,
maxConcurrency: 5,
async requestHandler({ page, request, log, enqueueLinks }) {
log.info(`Menjelajah: ${request.url}`);
// Periksa apakah ada CAPTCHA
const hasRecaptcha = await page.$('.g-recaptcha');
const hasTurnstile = await page.$('.cf-turnstile');
if (hasRecaptcha) {
const siteKey = await page.$eval(
'.g-recaptcha',
(el) => el.getAttribute('data-sitekey')
);
if (siteKey) {
log.info('Menyelesaikan reCAPTCHA...');
const token = await capSolver.solveReCaptchaV2(request.url, siteKey);
// Injeksikan token menggunakan JavaScript (elemen tersembunyi)
await page.$eval('#g-recaptcha-response', (el: HTMLTextAreaElement, t: string) => {
el.style.display = 'block';
el.value = t;
}, token);
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
}
}
if (hasTurnstile) {
const siteKey = await page.$eval(
'.cf-turnstile',
(el) => el.getAttribute('data-sitekey')
);
if (siteKey) {
log.info('Menyelesaikan Turnstile...');
const token = await capSolver.solveTurnstile(request.url, siteKey);
// Injeksikan token menggunakan JavaScript (elemen tersembunyi)
await page.$eval('input[name="cf-turnstile-response"]', (el: HTMLInputElement, t: string) => {
el.value = t;
}, token);
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
}
}
// Ekstrak data produk menggunakan lokator Playwright
const productCards = await page.locator('.product-card').all();
const products: Product[] = [];
for (const card of productCards) {
products.push({
name: await card.locator('.product-name').innerText().catch(() => ''),
price: await card.locator('.product-price').innerText().catch(() => ''),
url: await card.locator('a').getAttribute('href') || '',
image: await card.locator('img').getAttribute('src') || ''
});
}
if (products.length > 0) {
await Dataset.pushData(products);
log.info(`Ekstrak ${products.length} produk`);
}
// Enqueue tautan pagination dan kategori
await enqueueLinks({
globs: ['**/products/**', '**/page/**', '**/category/**']
});
},
failedRequestHandler({ request, log }) {
log.error(`Permintaan gagal: ${request.url}`);
}
});
// Mulai pencrawlan
await crawler.run(['https://example-store.com/products']);
// Ekspor hasil
const dataset = await Dataset.open();
await dataset.exportToCSV('products.csv');
console.log('Penjelajahan selesai! Hasil disimpan ke products.csv');
Kesimpulan
Mengintegrasikan CapSolver dengan Crawlee membuka potensi penuh untuk pengambilan data web bagi pengembang Node.js. Dengan menggabungkan infrastruktur pencrawlan yang kuat dari Crawlee dengan kemampuan penyelesaian CAPTCHA terkemuka dari CapSolver, Anda dapat membangun penjelajah yang andal yang mampu menangani mekanisme perlindungan bot paling menantang.
Baik Anda membangun pipeline ekstraksi data, sistem pemantauan harga, atau alat agregasi konten, kombinasi Crawlee + CapSolver memberikan keandalan dan skalabilitas yang dibutuhkan untuk lingkungan produksi.
Siap memulai? Daftar untuk CapSolver dan gunakan kode bonus CRAWLEE untuk bonus tambahan 6% pada setiap pengisian ulang!
FAQ
Apa itu Crawlee?
Crawlee adalah perpustakaan pengambilan data dan otomasi browser untuk Node.js yang dirancang untuk membangun pencrawlan yang andal. Ini mendukung pencrawlan berbasis HTTP (dengan Cheerio/JSDOM) dan otomasi browser penuh (dengan Playwright/Puppeteer), serta memiliki fitur bawaan seperti rotasi proxy, manajemen sesi, dan keamanan anti-bot.
Bagaimana CapSolver berintegrasi dengan Crawlee?
CapSolver berintegrasi dengan Crawlee melalui kelas layanan yang mengemas API CapSolver. Dalam handler permintaan crawler Anda, Anda dapat mendeteksi tantangan CAPTCHA dan menggunakan CapSolver untuk menyelesaikannya, lalu menyisipkan token kembali ke halaman.
Jenis CAPTCHA apa yang dapat diselesaikan CapSolver?
CapSolver mendukung berbagai jenis CAPTCHA seperti reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, AWS WAF, GeeTest, dan banyak lainnya.
Berapa biaya CapSolver?
CapSolver menawarkan harga kompetitif berdasarkan jenis dan volume CAPTCHA yang diselesaikan. Kunjungi capsolver.com untuk detail harga terkini. Gunakan kode CRAWLEE untuk bonus 6% pada pengisian ulang pertama Anda.
Apakah saya bisa menggunakan CapSolver dengan kerangka kerja Node.js lainnya?
Ya! CapSolver menyediakan API REST yang dapat diintegrasikan dengan kerangka kerja Node.js apa pun, termasuk Express, Puppeteer standalone, Selenium, dan lainnya.
Apakah Crawlee gratis digunakan?
Ya, Crawlee adalah open-source dan dirilis di bawah lisensi Apache 2.0. Kerangka kerja ini gratis digunakan, meskipun Anda mungkin menghadapi biaya layanan proxy dan layanan penyelesaian CAPTCHA seperti CapSolver.
Bagaimana cara menemukan kunci CAPTCHA?
Kunci CAPTCHA biasanya ditemukan dalam sumber HTML halaman. Cari:
- reCAPTCHA: atribut
data-sitekeypada elemen.g-recaptcha - Turnstile: atribut
data-sitekeypada elemen.cf-turnstile - Atau periksa permintaan jaringan untuk kunci dalam panggilan API
Tipe pencrawlan Crawlee apa yang harus saya gunakan?
- CheerioCrawler: Terbaik untuk pengambilan data HTML sederhana tanpa JavaScript
- PlaywrightCrawler: Terbaik untuk situs yang berat JavaScript dan penyelesaian CAPTCHA (direkomendasikan untuk integrasi CapSolver)
- PuppeteerCrawler: Alternatif untuk Playwright dengan kemampuan serupa
- JSDOMCrawler: Cocok sebagai tengah antara dengan dukungan JavaScript dasar
Pernyataan Kepatuhan: Informasi yang diberikan di blog ini hanya untuk tujuan informasi. CapSolver berkomitmen untuk mematuhi semua hukum dan peraturan yang berlaku. Penggunaan jaringan CapSolver untuk kegiatan ilegal, penipuan, atau penyalahgunaan sangat dilarang dan akan diselidiki. Solusi penyelesaian captcha kami meningkatkan pengalaman pengguna sambil memastikan kepatuhan 100% dalam membantu menyelesaikan kesulitan captcha selama pengambilan data publik. Kami mendorong penggunaan layanan kami secara bertanggung jawab. Untuk informasi lebih lanjut, silakan kunjungi Syarat Layanan dan Kebijakan Privasi.
Lebih lanjut

Pemaster MCP: Tingkatkan Kecerdasan AI pada 2026
Protokol Konteks Model (MCP) adalah masa depan integrasi AI. Pelajari bagaimana MCP menstandarkan komunikasi antara alat AI, mendorong otomatisasi perusahaan, dan meningkatkan kecerdasan AI pada tahun 2026.

Adélia Cruz
24-Dec-2025

Cara menyelesaikan Captcha di Crawlee dengan Integrasi CapSolver
Panduan praktis untuk mengatasi reCAPTCHA dan Turnstile di Crawlee dengan menggunakan CapSolver untuk pengambilan data Node.js yang stabil.

Adélia Cruz
24-Dec-2025

Layanan Perusahaan Proxy Terbaik yang Harus Anda Ketahui
Blog ini memberikan pandangan mendalam tentang lima penyedia layanan proxy terkemuka: ProxyScrape.com, Proxies.gg, Asocks.com, MetaProxies, RushProxy, dan Ake.net. Masing-masing bagian blog ini membahas penawaran unik, fitur, harga, dan manfaat dari layanan masing-masing, menyoroti kekuatan dan keahlian mereka. Dari proxy perumahan dan mobile hingga pilihan datacenter, blog ini menawarkan ulasan menyeluruh tentang lingkungan proxy yang beragam. Apakah Anda adalah bisnis yang mencari alat analisis pasar, individu yang mencari privasi online, atau pengembang yang membutuhkan solusi pengambilan data web, blog ini berfungsi sebagai panduan berharga untuk memahami dan memilih layanan proxy yang tepat sesuai kebutuhan Anda.

Anh Tuan
24-Dec-2025

Alat Pengambilan Data Web - Dijelaskan
Temukan alat pengambilan data web terbaik untuk ekstraksi data yang efisien dari situs web, cocok untuk para coder maupun non-coder, di panduan komprehensif kami

Sora Fujimoto
23-Dec-2025

Cara Menyelesaikan Captcha di CrewAI dengan Integrasi CapSolver
Integrasi CrewAI dengan CapSolver memungkinkan penanganan CAPTCHA yang berjalan lancar untuk reCAPTCHA, Cloudflare Turnstile, AWS WAF, dan lainnya, meningkatkan tugas web otomatis.

Ethan Collins
23-Dec-2025

Bahasa Pemrograman Terbaik untuk Web Scraping pada 2026
Memilih bahasa pemrograman yang tepat untuk web scraping sangat penting. Bandingkan Python, Go, JavaScript, dan lainnya untuk kinerja dan skala pada 2026. Selain itu, pelajari bagaimana CapSolver memastikan kesuksesan.

Emma Foster
19-Dec-2025


