CrawlForge MCP
Panduan Pertengahan

Panduan Pemprosesan Kelompok

Skalakan scraping web ke beribu-ribu URL dengan pengurusan baris gilir yang cekap, pemulihan ralat, dan strategi pengoptimuman prestasi.

Menggunakan Alat batch_scrape
Pengurusan Baris Gilir
Pemulihan Ralat
Pengoptimuman Prestasi

1. Menggunakan Alat batch_scrape

Alat batch_scrape mengambil sehingga 50 URL secara serentak dalam satu permintaan segerak. Setiap URL kembali dengan statusnya sendiri, jadi satu halaman mati tidak menenggelamkan keseluruhan kelompok.

Scraping Kelompok Asas

5 credits bagi setiap URL yang dicuba (50 URL = 250 credits)

Bash
curl -X POST https://crawlforge.dev/api/v1/tools/batch_scrape \
  -H "X-API-Key: cf_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "urls": [
      { "url": "https://example.com/page1" },
      { "url": "https://example.com/page2" },
      { "url": "https://example.com/page3" }
    ],
    "batch_config": { "concurrency": 5 }
  }'
Tiada mod async pada API REST: batch_scrape melalui HTTP adalah segerak - satu permintaan masuk, hasil siap keluar. Tiada id kerja untuk ditinjau dan tiada webhook: batch_id ialah kunci pengambilan untuk get_batch_results, bukan pemegang kerja. Pecahkan apa-apa yang melebihi 50 URL seperti ditunjukkan di bawah. Pelayan MCP CrawlForge boleh menjalankan kelompok 50 URL yang sama di latar belakang dengan mode: 'async' dan webhook pilihan.

2. Pengurusan Baris Gilir

Proses beribu-ribu URL dengan memecahkannya kepada kelompok dan menguruskan baris gilir.

Strategi Pemecahan

Pecahkan senarai URL yang besar kepada kelompok yang boleh diuruskan

Typescript
// Chunk array into batches of 50
function chunkArray<T>(array: T[], size: number): T[][] {
  const chunks: T[][] = [];
  for (let i = 0; i < array.length; i += size) {
    chunks.push(array.slice(i, i + size));
  }
  return chunks;
}

// Process all URLs in batches
async function processBatches(urls: string[]) {
  const batches = chunkArray(urls, 50); // Max 50 URLs per batch
  const allResults: any[] = [];

  for (let i = 0; i < batches.length; i++) {
    const batch = batches[i];
    console.log(`Processing batch ${i + 1}/${batches.length}...`);

    const response = await fetch('https://crawlforge.dev/api/v1/tools/batch_scrape', {
      method: 'POST',
      headers: {
        'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        urls: batch.map(url => ({ url })),
        batch_config: { concurrency: 8 },
      }),
    });

    const data = await response.json();
    allResults.push(...data.data.results);

    // Wait between batches to respect rate limits
    if (i < batches.length - 1) {
      await new Promise(resolve => setTimeout(resolve, 2000));
    }
  }

  return allResults;
}

// Usage
const urls = [...]; // 500 URLs
const results = await processBatches(urls);
console.log(`Scraped ${results.length} total pages`);
Petua Pro: Gunakan Redis atau pangkalan data untuk menyimpan baris gilir anda. Ini membolehkan anda menyambung semula pemprosesan jika skrip anda terhempas atau perlu dimulakan semula.

3. Pemulihan Ralat

Kendalikan kegagalan dengan baik menggunakan logik cuba semula dan penjejakan ralat.

Pengendalian Ralat yang Mantap

Typescript
interface BatchResult {
  successful: any[];
  failed: { url: string; error: string }[];
}

async function batchScrapeWithRetry(
  urls: string[],
  maxRetries = 3
): Promise<BatchResult> {
  const successful: any[] = [];
  const failed: { url: string; error: string }[] = [];
  let remainingUrls = [...urls];
  let retries = 0;

  while (remainingUrls.length > 0 && retries <= maxRetries) {
    try {
      const response = await fetch('https://crawlforge.dev/api/v1/tools/batch_scrape', {
        method: 'POST',
        headers: {
          'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          urls: remainingUrls.map(url => ({ url })),
          batch_config: { concurrency: 5 },
        }),
      });

      const data = await response.json();

      // Each result carries its own status: 'success' | 'failed' | 'skipped'.
      // 'skipped' means the request's time budget ran out before that URL was
      // started — those are not charged, so they are always worth retrying.
      const batchSuccessful = data.data.results.filter((r: any) => r.status === 'success');
      const batchUnfinished = data.data.results.filter((r: any) => r.status !== 'success');

      successful.push(...batchSuccessful);

      // Only retry the URLs that did not come back successful
      remainingUrls = batchUnfinished.map((r: any) => r.url);

      if (remainingUrls.length > 0) {
        console.log(`Retrying ${remainingUrls.length} failed URLs...`);
        retries++;
        await new Promise(resolve => setTimeout(resolve, 2000 * retries));
      }

    } catch (error) {
      console.error('Batch request failed:', error);
      retries++;

      if (retries > maxRetries) {
        // Mark all remaining URLs as failed
        failed.push(...remainingUrls.map(url => ({
          url,
          error: String(error)
        })));
        break;
      }

      await new Promise(resolve => setTimeout(resolve, 2000 * retries));
    }
  }

  return { successful, failed };
}

// Usage
const { successful, failed } = await batchScrapeWithRetry(urls);
console.log(`Success: ${successful.length}, Failed: ${failed.length}`);

// Save failed URLs for manual review
if (failed.length > 0) {
  fs.writeFileSync('failed-urls.json', JSON.stringify(failed, null, 2));
}

4. Pengoptimuman Prestasi

Maksimumkan throughput dan minimumkan kos dengan strategi pengoptimuman ini.

Optimumkan Keserentakan
Mulakan dengan batch_config.concurrency: 5. API menerima 1-10 dan menjalankan paling banyak 8 pekerja
Beri Perhatian pada Bajet Masa
Satu permintaan mengambil selama kira-kira 20s. URL yang tidak sempat dimulakan kembali sebagai skipped - dan URL yang dilangkau tidak dicaj
Baca Semula, Jangan Scrape Semula
Keputusan disimpan selama 24j. Selak melaluinya dengan get_batch_results (1 credit) dan bukannya mengulang kelompok itu (5 credits setiap URL)
Cache Keputusan
Simpan data yang di-scrape dalam Redis/pangkalan data untuk mengelakkan scraping semula URL yang sama
Elakkan Pengelompokan Berlebihan
Jangan melebihi 50 URL setiap kelompok - pecahkan kepada berbilang permintaan sebaliknya
Jangan Abaikan Had Kadar
Hormati had kadar pelan anda (Free: 1/s, Hobby: 2/s, Pro: 4/s, Business: 10/s)

Prestasi Dijangka

SenarioMasaTetapan
Kelompok Kecil (10 URL)~5 saatconcurrency: 5
Kelompok Sederhana (50 URL)~15 saatconcurrency: 8
Kelompok Besar (500 URL)~3 minit10 kelompok × 50 URL
Kelompok Sangat Besar (5,000 URL)~30 minit100 kelompok × 50 URL
Langkah Seterusnya
Teruskan pembelajaran dengan lebih banyak panduan lanjutan
Pengoptimuman Credit →
Minimumkan kos
Teknik Stealth →
Pintas sistem anti-bot

Footer

CrawlForge MCP

Web scraping gred perusahaan untuk Ejen AI. 29 alat MCP khusus yang direka untuk pembangun moden yang membina sistem pintar.

Produk

  • Ciri
  • Playground
  • Harga
  • Kes Penggunaan
  • Integrasi
  • Alternatif
  • Changelog

Sumber

  • Mula Bekerja
  • Rujukan API
  • Templat
  • Panduan
  • Blog
  • Glosari
  • Soalan Lazim
  • Peta Laman

Pembangun

  • Protokol MCP
  • Claude Desktop
  • Cursor IDE
  • LangChain
  • LlamaIndex

Syarikat

  • Tentang
  • Hubungi
  • Privasi
  • Terma
  • Penggunaan Boleh Diterima
  • Cookies

Kekal dikemas kini

Dapatkan kemas kini terkini tentang alat dan ciri baharu.

Dibina dengan Next.js dan protokol MCP

© 2025-2026 CrawlForge. Hak cipta terpelihara.