クローリーでキャプチャを解く方法とキャプソルバー統合

Sora Fujimoto
AI Solutions Architect
24-Dec-2025
TL;DR: Crawleeクローラーは頻繁にCAPTCHAの障壁に遭遇します。CapSolverを統合することで、reCAPTCHAやTurnstileなどに対処でき、スクレイピングワークフローを安定させ、自動化を維持できます。

Crawleeでクローラーを構築する際、CAPTCHAに遭遇することは避けられません—特に、ボット保護が厳格な現代のサイトでは特にそうです。PlaywrightやHTTPクローラーを適切に設定しても、reCAPTCHAやTurnstileなどのチャレンジが現れるとブロックされることがあります。
このガイドでは、Crawleeワークフロー内で直接CAPTCHAチャレンジを処理する実践的なアプローチに焦点を当てます。ブラウザのファイントプリントを無限に戦う代わりに、一般的なCAPTCHAタイプの検出、プログラムで解決、そして現実的なスクレイピングシナリオでクローラーが信頼性を持って動作し続ける方法を紹介します。
Crawleeとは?
Crawleeは、Node.js向けのウェブスクレイピングとブラウザ自動化ライブラリで、現代のボット保護をかいくぐる人間のようなクローラーを構築するためのものです。TypeScriptで構築されており、高レベルのシンプルさと低レベルのカスタマイズ性を提供します。
Crawleeの主な特徴
- 統一インターフェース: HTTPとヘッドレスブラウザクローリングのための単一API
- ボット保護回避: 自動的なブラウザファイントプリント生成、TLSファイントプリントの複製、人間のような挙動
- スマートなキュー管理: 幅優先と深さ優先クローリングオプションを備えた永続的なURLキュー
- 自動スケーリング: システム負荷に応じたリソースの自動スケーリング
- プロキシローテーション: 組み込みのプロキシローテーションとセッション管理
- 複数ブラウザサポート: Chrome、Firefox、WebKitでのPlaywrightとPuppeteerのサポート
クローラータイプ
Crawleeはさまざまな使用シナリオに応じた複数のクローラータイプを提供します。
| クローラータイプ | 説明 |
|---|---|
| CheerioCrawler | CheerioによるHTMLパースのための高速HTTPクローラー |
| PlaywrightCrawler | JavaScript重視のサイト用の完全なブラウザ自動化(Playwright) |
| PuppeteerCrawler | JavaScriptレンダリング用の完全なブラウザ自動化(Puppeteer) |
| JSDOMCrawler | ブラウザなしでのJavaScript実行用のHTTPクローラー |
CapSolverとは?
CapSolverは、さまざまなCAPTCHAチャレンジを回避するためのAI駆動の解決サービスです。複数のCAPTCHAタイプをサポートし、高速な応答時間を提供し、自動化ワークフローにシームレスに統合されます。
サポートされているCAPTCHAタイプ
- reCAPTCHA v2(画像版および非表示版)
- reCAPTCHA v3
- Cloudflare Turnstile
- AWS WAF
- その他多数...
CrawleeにCapSolverを統合する理由
Crawleeで保護されたウェブサイトと相互作用するクローラーを構築する際、CAPTCHAチャレンジはスクレイピングパイプラインを停止させます。統合が重要な理由は以下の通りです。
- 中断のないクローリング: 手動介入なしでクローラーがデータを抽出し続けます
- スケーラブルな運用: 同時に実行されるクローリングセッションで複数のCAPTCHAチャレンジを処理できます
- コスト効率が良い: 成功したCAPTCHAの解決のみに料金が発生します
- 高い成功確率: サポートされているすべてのCAPTCHAタイプで業界トップクラスの正確性
インストール
まず、必要なパッケージをインストールしてください:
bash
npm install crawlee playwright axios
またはyarnで:
bash
yarn add crawlee playwright axios
Crawlee用のCapSolverユーティリティの作成
以下は、Crawleeプロジェクト全体で再利用可能なCapSolverユーティリティクラスです。
基本的なCapSolverサービス
typescript
import axios from 'axios';
const CAPSOLVER_API_KEY = 'YOUR_CAPSOLVER_API_KEY';
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(`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(`タスク失敗: ${response.data.errorDescription}`);
}
}
throw new Error('CAPTCHAの解決を待つタイムアウト');
}
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();
Crawleeで異なるCAPTCHAタイプを解決する方法
PlaywrightCrawlerでのreCAPTCHA v2の解決
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
const RECAPTCHA_SITE_KEY = 'YOUR_SITE_KEY';
const crawler = new PlaywrightCrawler({
async requestHandler({ page, request, log }) {
log.info(`Processing ${request.url}`);
// ページにreCAPTCHAがあるか確認
const hasRecaptcha = await page.$('.g-recaptcha');
if (hasRecaptcha) {
log.info('reCAPTCHAが検出されました、解決中...');
// ページからサイトキーを取得
const siteKey = await page.$eval(
'.g-recaptcha',
(el) => el.getAttribute('data-sitekey')
) || RECAPTCHA_SITE_KEY;
// CAPTCHAを解決
const token = await capSolver.solveReCaptchaV2(request.url, siteKey);
// トークンを注入 - テキストエリアは非表示なのでJavaScriptを使用
await page.$eval('#g-recaptcha-response', (el: HTMLTextAreaElement, token: string) => {
el.style.display = 'block';
el.value = token;
}, token);
// フォームを送信
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
log.info('reCAPTCHAは正常に解決されました!');
}
// CAPTCHAが解決された後でデータを抽出
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/protected-page']);
PlaywrightCrawlerでのreCAPTCHA v3の解決
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
const crawler = new PlaywrightCrawler({
async requestHandler({ page, request, log }) {
log.info(`Processing ${request.url}`);
// reCAPTCHA v3は非表示のため、スクリプトで検出
const recaptchaScript = await page.$('script[src*="recaptcha/api.js?render="]');
if (recaptchaScript) {
log.info('reCAPTCHA v3が検出されました、解決中...');
// スクリプトのsrcからサイトキーを抽出
const scriptSrc = await recaptchaScript.getAttribute('src') || '';
const siteKeyMatch = scriptSrc.match(/render=([^&]+)/);
const siteKey = siteKeyMatch ? siteKeyMatch[1] : '';
if (siteKey) {
// reCAPTCHA v3を解決
const token = await capSolver.solveReCaptchaV3(
request.url,
siteKey,
'submit'
);
// JavaScriptを使用して非表示の入力フィールドにトークンを注入
await page.$eval('input[name="g-recaptcha-response"]', (el: HTMLInputElement, token: string) => {
el.value = token;
}, token);
log.info('reCAPTCHA v3トークンが注入されました!');
}
}
// フォーム送信またはデータ抽出を続行
const title = await page.title();
const url = page.url();
await Dataset.pushData({ title, url });
}
});
await crawler.run(['https://example.com/v3-protected']);
PlaywrightCrawlerでのCloudflare Turnstileの解決
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
const crawler = new PlaywrightCrawler({
async requestHandler({ page, request, log }) {
log.info(`Processing ${request.url}`);
// Turnstileウィジェットをチェック
const hasTurnstile = await page.$('.cf-turnstile');
if (hasTurnstile) {
log.info('Cloudflare Turnstileが検出されました、解決中...');
// サイトキーを取得
const siteKey = await page.$eval(
'.cf-turnstile',
(el: Element) => el.getAttribute('data-sitekey')
);
if (siteKey) {
// Turnstileを解決
const token = await capSolver.solveTurnstile(request.url, siteKey);
// JavaScriptを使用して非表示の入力フィールドにトークンを注入
await page.$eval('input[name="cf-turnstile-response"]', (el: HTMLInputElement, token: string) => {
el.value = token;
}, token);
// フォームを送信
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
log.info('Turnstileは正常に解決されました!');
}
}
// データを抽出
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/turnstile-protected']);
高度な統合: CAPTCHAタイプの自動検出
以下は、異なる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> {
// 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 };
}
// 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 };
}
// 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);
// 非表示のテキストエリア - JavaScriptを使用して値を設定
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);
// 非表示の入力 - JavaScriptを使用して値を設定
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);
// 非表示の入力 - JavaScriptを使用して値を設定
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(`Processing ${request.url}`);
// CAPTCHAを自動検出
const captchaInfo = await detectCaptcha(page);
if (captchaInfo.type !== 'none') {
log.info(`Detected ${captchaInfo.type}, solving...`);
await solveCaptcha(page, request.url, captchaInfo);
// フォームが存在する場合を送信
const submitBtn = await page.$('button[type="submit"], input[type="submit"]');
if (submitBtn) {
await submitBtn.click();
await page.waitForLoadState('networkidle');
}
log.info('CAPTCHAは正常に解決されました!');
}
// データの抽出
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)
});
// スクレイピングを継続
await enqueueLinks();
},
maxRequestsPerCrawl: 100
});
await crawler.run(['https://example.com']);
CAPTCHAトークンの提出方法
各CAPTCHAタイプはブラウザコンテキストで異なる提出方法を必要とします。
reCAPTCHA v2/v3 - トークンインジェクション
typescript
async function submitRecaptchaToken(page: any, token: string): Promise<void> {
// 応答テキストエリアは非表示です - JavaScriptを使用して値を設定します
await page.$eval('#g-recaptcha-response', (el: HTMLTextAreaElement, token: string) => {
el.style.display = 'block';
el.value = token;
}, token);
// カスタム実装で一般的な非表示入力フィールドを設定
try {
await page.$eval('input[name="g-recaptcha-response"]', (el: HTMLInputElement, token: string) => {
el.value = token;
}, token);
} catch (e) {
// 入力フィールドが存在しない可能性があります
}
// フォームを送信
await page.click('form button[type="submit"]');
}
Turnstile - トークンインジェクション
typescript
async function submitTurnstileToken(page: any, token: string): Promise<void> {
// JavaScriptを使用して非表示入力フィールドにトークンを設定
await page.$eval('input[name="cf-turnstile-response"]', (el: HTMLInputElement, token: string) => {
el.value = token;
}, token);
// フォームを送信
await page.click('form button[type="submit"]');
}
CrawleeでCapSolverブラウザ拡張機能を使用する方法
自動CAPTCHA解決を希望するシナリオでは、CapSolverブラウザ拡張機能をロードできます:
typescript
import { PlaywrightCrawler } from 'crawlee';
import path from 'path';
const crawler = new PlaywrightCrawler({
launchContext: {
launchOptions: {
// CapSolver拡張機能をロード
args: [
`--disable-extensions-except=${path.resolve('./capsolver-extension')}`,
`--load-extension=${path.resolve('./capsolver-extension')}`
],
headless: false // 拡張機能はヘッドレスモードを必要としません
}
},
async requestHandler({ page, request, log }) {
log.info(`処理中: ${request.url}`);
// 拡張機能が自動的にCAPTCHAを解決します
// 可能なCAPTCHAの解決を待つ
await page.waitForTimeout(5000);
// スクレイピングを継続
const title = await page.title();
const content = await page.locator('body').innerText();
console.log({ title, content });
}
});
await crawler.run(['https://example.com/captcha-page']);
最適な実践方法
1. エラー処理とリトライ
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; // 指数バックオフ
await new Promise(resolve => setTimeout(resolve, delay));
}
}
throw new Error('最大リトライ回数に達しました');
}
// 使用例
const token = await solveWithRetry(() =>
capSolver.solveReCaptchaV2(url, siteKey)
);
2. バランス管理
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;
}
// クラウダー起動前にチェック
const balance = await checkBalance(CAPSOLVER_API_KEY);
if (balance < 1) {
console.warn('CapSolverの残高が少なくなっています!再充電してください。');
}
3. 複数ページ用のセッション管理
typescript
import { PlaywrightCrawler, Dataset } from 'crawlee';
import { capSolver } from './capsolver-service';
// 同じドメイン/キーの組み合わせの解決済みトークンをキャッシュ
const tokenCache = new Map<string, { token: string; timestamp: number }>();
const TOKEN_TTL = 90000; // 90秒
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. プロキシの統合
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(`使用中のプロキシ: ${proxyInfo?.url}`);
// ここにCAPTCHA解決とスクレイピングロジックを記述
}
});
完全な例: CAPTCHA対応のECサイトスクラッパー
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(`スクラッピング中: ${request.url}`);
// 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('reCAPTCHAを解決中...');
const token = await capSolver.solveReCaptchaV2(request.url, siteKey);
// JavaScriptを使用してトークンをインジェクト(非表示要素)
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('Turnstileを解決中...');
const token = await capSolver.solveTurnstile(request.url, siteKey);
// JavaScriptを使用してトークンをインジェクト(非表示要素)
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');
}
}
// 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(`${products.length}個の製品を抽出しました`);
}
// ページングとカテゴリリンクをキューイング
await enqueueLinks({
globs: ['**/products/**', '**/page/**', '**/category/**']
});
},
failedRequestHandler({ request, log }) {
log.error(`リクエスト失敗: ${request.url}`);
}
});
// スクレイピングを開始
await crawler.run(['https://example-store.com/products']);
// 結果をエクスポート
const dataset = await Dataset.open();
await dataset.exportToCSV('products.csv');
console.log('スクレイピングが完了しました!結果はproducts.csvに保存されています');
結論
CrawleeとCapSolverを統合することで、Node.js開発者はウェブスクラッピングの潜在能力を最大限に引き出すことができます。Crawleeの強力なクローラーインフラとCapSolverの業界をリードするCAPTCHA解決能力を組み合わせることで、最も難しいボット保護メカニズムに対処できる信頼性の高いクローラーを構築できます。
価格モニタリングシステムやコンテンツアグリゲーションツールなどの構築において、Crawlee + CapSolverの組み合わせは、本番環境で必要な信頼性とスケーラビリティを提供します。
さっそく始めましょうか? CapSolverに登録し、ボーナスコード CRAWLEE を使用して、初回チャージで6%のボーナスを獲得しましょう!
よくある質問
Crawleeとは何ですか?
Crawleeは、Node.jsで信頼性の高いクローラーを構築するためのウェブスクラッピングおよびブラウザ自動化ライブラリです。HTTPベースのクローリング(Cheerio/JSDOM)と完全なブラウザ自動化(Playwright/Puppeteer)をサポートしており、プロキシローテーション、セッション管理、アンチボットステルスなどの組み込み機能を備えています。
CapSolverはCrawleeとどのように統合されますか?
CapSolverは、Crawleeのサービスクラスを通じて統合されます。クローラーのリクエストハンドラー内でCAPTCHAチャレンジを検出し、CapSolverを使用して解決し、そのトークンをページに戻すことができます。
CapSolverが解決できるCAPTCHAの種類は?
CapSolverは、reCAPTCHA v2、reCAPTCHA v3、Cloudflare Turnstile、AWS WAF、GeeTestなど、幅広いCAPTCHAタイプをサポートしています。
CapSolverの料金はどのくらいですか?
CapSolverは、解決するCAPTCHAの種類と量に基づいて競争力のある料金を提供しています。現在の料金詳細についてはcapsolver.comをご覧ください。初回チャージでボーナスコード CRAWLEE を使用して6%のボーナスを獲得できます。
他のNode.jsフレームワークでCapSolverを使用できますか?
はい!CapSolverはREST APIを提供しており、任意のNode.jsフレームワーク(Express、Puppeteerスタンドアロン、Seleniumなど)に統合可能です。
Crawleeは無料で使用できますか?
はい、CrawleeはApache 2.0ライセンスでオープンソースとしてリリースされており、無料で使用できます。ただし、プロキシサービスやCapSolverなどのCAPTCHA解決サービスの利用には費用が発生する可能性があります。
CAPTCHAのサイトキーを見つける方法は?
サイトキーは通常、ページのHTMLソースにあります。以下を確認してください:
- reCAPTCHA:
.g-recaptcha要素のdata-sitekey属性 - Turnstile:
.cf-turnstile要素のdata-sitekey属性 - またはAPI呼び出しでキーパララメータを確認
使用するべきCrawleeクローラータイプは?
- CheerioCrawler: JavaScriptを必要としない高速で単純なHTMLスクラッピングに最適
- PlaywrightCrawler: JavaScriptが豊富なサイトとCAPTCHA解決に最適(CapSolver統合には推奨)
- PuppeteerCrawler: Playwrightと同様の機能を持つ代替クローラー
- JSDOMCrawler: 基本的なJavaScriptサポートを持つ中間的な選択肢
コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。
もっと見る

マスターMCP: AIのスマートを2026年に高める
モデルコンテキストプロトコル(MCP)は、AI統合の未来です。2026年におけるAIツール間の通信の標準化、企業の自動化の推進、AIの知能の向上について学びましょう。

Anh Tuan
24-Dec-2025

クローリーでキャプチャを解く方法とキャプソルバー統合
CrawleeでreCAPTCHAとTurnstileを解決するための実践的なガイド: CapSolverを使用して安定したNode.jsスクリーピングを実現する方法

Sora Fujimoto
24-Dec-2025

最高のプロキシ会社のサービスを知っておくべき
このブログは、5つの主要なプロキシサービスプロバイダー、ProxyScrape.com、Proxies.gg、Asocks.com、MetaProxies、RushProxy、およびAke.netについて詳細な解説を提供しています。ブログの各セクションでは、各サービスの独自の提供物、特徴、料金、および利点について詳しく説明し、その強みや特長を強調しています。住宅用およびモバイルプロキシからデータセンターのオプションまで、ブログは多様なプロキシの市場について包括的な概要を提供しています。市場分析ツールを探している企業、オンラインプライバシーを求める個人、またはウェブスクレイピングソリューションが必要な開発者にとって、このブログはニーズに合った適切なプロキシサービスを選択し理解するための貴重なガイドとなります。

Anh Tuan
24-Dec-2025

ウェブスクリーピングツール - 解説
ウェブサイトから効率的なデータ抽出に適したトップウェブスクラッピングツールを、コーダーとノンコーダーの両方に適した包括的なガイドで紹介します。

Ethan Collins
23-Dec-2025

CrewAIでCAPTCHAを解く方法とCapSolverとの統合
CrewAIとCapSolverの統合により、reCAPTCHA、Cloudflare Turnstile、AWS WAFなどにおけるCAPTCHA処理をシームレスに実行でき、自動化されたウェブ作業を向上させます。

Sora Fujimoto
23-Dec-2025

2026年のウェブスクリーピングに最適なプログラミング言語
ウェブスクリーピングに適したプログラミング言語を選ぶことは不可欠です。2026年のパフォーマンスとスケーラビリティを考慮して、Python、Go、JavaScriptなどと比較する。さらに、CapSolverが成功を実現する方法を学ぶ。

Nikolai Smirnov
19-Dec-2025


