batch_scrape
Ambil banyak URL dalam satu panggilan dengan kumpulan pekerja berkongsi. Permintaan ini segerak — ia mengembalikan hasil yang siap, bukan pemegang kerja — dan setiap URL kembali dengan statusnya sendiri, jadi satu halaman mati tidak pernah menenggelamkan kelompok itu. Hasilnya turut disimpan selama 24 jam dan boleh dibaca semula dengan get_batch_results.
Kes Penggunaan
Sapuan Harga Pesaing
Tarik medan CSS yang sama daripada lima puluh halaman produk dalam satu permintaan, dan bukannya lima puluh perjalanan pergi balik.
Semakan Kesihatan Pautan
Hantar senarai URL dan baca http_status bagi setiap entri. Apa-apa yang tidak dapat dicapai kembali sebagai failed berserta sebabnya.
Inventori Kandungan
Suapkan peta tapak ke dalam kelompok dan kumpulkan setiap tajuk dan URL kanonik untuk hamparan audit.
Pengesahan Selepas Penggunaan
Periksa bahawa satu set halaman kritikal masih mengembalikan 200 dan masih mengandungi elemen yang anda jangkakan.
Pemasangan Set Data
Kumpulkan 5,000 aksara pertama teks body daripada senarai URL sebagai input kepada saluran hiliran.
Pengumpulan Tertunda
Jalankan kelompok sekarang dan tarik hasil yang disimpan kemudian daripada proses lain dengan get_batch_results.
Endpoint
/api/v1/tools/batch_scrapeParameters
urls, batch_config.concurrency dan extraction_template.fields mengubah apa yang dilakukannya. Selebihnya disahkan kemudian diabaikan; setiap satu dinyatakan dalam jadual di bawah.| Name | Type | Required | Default | Description |
|---|---|---|---|---|
urls | array | Required | - | URL yang akan diambil. Antara 1 dan 50 entri; senarai yang lebih panjang ditolak dan bukannya dipotong. Example: [{ "url": "https://example.com/widget-a", "id": "a" }] |
batch_config | object | Optional | - | Tetapan pelaksanaan bagi kelompok ini. Example: { "concurrency": 5 } |
extraction_template | object | Optional | - | Medan yang akan dikeluarkan daripada setiap halaman dalam kelompok. Example: { "fields": [{ "name": "price", "selector": ".price" }] } |
output_config | object | Optional | - | Diterima dan diabaikan sepenuhnya. Respons sentiasa JSON dalam bentuk yang ditunjukkan di bawah; `format`, `include_metadata`, `include_errors` dan `flatten_results` tidak memberi kesan. Example: { "format": "json" } |
options | object | Optional | - | Diterima dan diabaikan, kecuali `javascript_enabled: true` menambah satu baris penjelasan pada `notes`. `user_agent`, `follow_redirects`, `respect_robots_txt` dan `rate_limit_per_domain` tidak mengubah cara pengambilan pada API REST terhoskan. Example: { "javascript_enabled": false } |
respect_robots | boolean | Optional | true | Hormati robots.txt setiap tapak sasaran. Dibiarkan pada `true`, URL yang dilarang untuk `CrawlForge` dilangkau dan selebihnya kelompok itu diteruskan — permintaan tetap mengembalikan 200 dengan set keputusan separa dan bukannya 403, dan URL yang dilangkau tidak dicaj. Tetapkan kepada `false` hanya untuk sasaran yang anda mempunyai perjanjian sendiri dengannya — respons kemudiannya membawa entri `warnings` dan tindakan mengatasi itu direkodkan pada API key anda. Example: true |
Model Pelaksanaan
Baik diketahui sebelum anda menentukan saiz kelompok — hujung ini berjalan dalam fungsi tanpa pelayan selama 30 saat.
batch_id ialah kunci pengambilan, bukan pemegang kerja.skipped dan tidak dicaj. Setiap pengambilan individu tamat masa pada 8s.failed. Panggilan itu sendiri masih mengembalikan 200.Contoh Permintaan
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/widget-a", "id": "a" },
{ "url": "https://example.com/widget-b", "id": "b" }
],
"batch_config": { "concurrency": 5 },
"extraction_template": {
"fields": [
{ "name": "price", "selector": ".price" },
{ "name": "canonical", "selector": "link[rel=canonical]", "attribute": "href" }
]
}
}'Contoh Respons
{ "success": true, "data": { "batch_id": "fd599a27-9ca9-4022-9a57-b02af57c387b", "total": 3, "succeeded": 2, "failed": 1, "skipped": 0, "results": [ { "id": "a", "url": "https://example.com/widget-a", "status": "success", "http_status": 200, "title": "Widget A — Acme", "text": "Widget A$24.00In stock and ready to ship.", "fields": { "price": "$24.00", "canonical": "https://example.com/widget-a", "sku": null }, "field_notes": [ "sku: xpath selectors are not supported on the hosted REST API — use a CSS selector" ] }, { "id": "b", "url": "https://example.com/widget-b", "status": "success", "http_status": 200, "title": "Widget B — Acme", "text": "Widget B$31.50Backordered until March.", "fields": { "price": "$31.50", "canonical": "https://example.com/widget-b", "sku": null } }, { "id": "c", "url": "https://example.com/gone", "status": "failed", "http_status": 404, "error": "HTTP 404" } ], "notes": [ "Results are stored for 24h and retrievable with get_batch_results (batch_id: fd599a27-9ca9-4022-9a57-b02af57c387b)." ], "completed_at": "2026-08-27T02:09:44.001Z" }, "credits_used": 15, "credits_remaining": 990, "processing_time": 3140}data.batch_idHantar ini kepada [get_batch_results](/docs/api-reference/tools/get-batch-results) dalam masa 24 jam untuk membaca semula set penuhdata.totalEntri yang dihantar — sentiasa sama dengan panjang `results`data.skippedURL yang tidak sempat dicapai oleh bajet masa. Tidak dicajdata.results[].id`id` anda jika anda memberikannya, jika tidak indeks tatasusunan sebagai rentetandata.results[].status`success`, `failed` atau `skipped` — periksa ini bagi setiap entri, bukan status HTTPdata.results[].textTeks body yang kelihatan dengan script dan style dibuang, dipotong pada 5,000 aksaradata.results[].fieldsSatu kunci bagi setiap medan templat. `null` bermakna pemilih itu tidak sepadan dengan apa-apadata.results[].field_notesHadir hanya apabila sesuatu medan tidak dapat digunakan — pemilih xpath, atau CSS yang ditolak oleh penghuraidata.notesCatatan peringkat kelompok, termasuk apa-apa yang anda minta tetapi tidak dilakukan oleh API terhoskancredits_used5 bagi setiap URL yang dicuba — 3 URL di sini, tiada yang dilangkau, jadi 15Pengendalian Ralat
Kelompok Tidak Sah (400 Bad Request)
VALIDATION_ERROR. Dibangkitkan oleh tatasusunan urls yang kosong, lebih daripada 50 entri, URL yang cacat, atau concurrency di luar 1-10. Tiada apa-apa diambil dan tiada apa-apa dicaj.
Storan Tidak Tersedia (503 Service Unavailable)
STORAGE_UNAVAILABLE. Hasil disimpan sebelum pengebilan, jadi jika storan itu tidak dapat dicapai kelompok ini ditolak dan bukannya dijalankan lalu hilang. Tiada apa-apa dicaj. Cuba semula.
Kelompok Gagal (500 Internal Server Error)
TOOL_ERROR. Kerosakan yang tidak dijangka. Masalah setiap URL tidak pernah muncul di sini — ia muncul sebagai entri failed dalam respons 200.
Dilarang oleh robots.txt (bukan ralat — URL itu dilangkau)
URL yang dilarang oleh robots.txt untuk CrawlForge ditinggalkan daripada kelompok dan bukannya menggagalkannya: panggilan itu tetap mengembalikan 200 dengan set keputusan separa dan URL yang dilangkau tidak dicaj, jadi baca keputusan setiap URL sebelum menganggap kelompok itu lengkap. Tetapkan respect_robots: false untuk mengatasinya bagi sasaran yang anda mempunyai perjanjian sendiri dengannya — tindakan mengatasi itu direkodkan pada API key anda. Tindakan mengatasi itu tidak sampai kepada hos yang berada dalam senarai penarikan diri kekal CrawlForge: hos itu ditolak tanpa mengira nilai respect_robots, dan ia turut dilangkau serta tidak dicaj dengan cara yang sama, dengan hos itu dinamakan dalam medan error keputusan tersebut. data.notes merumuskan berapa banyak URL yang dilangkau dan sebabnya.
succeeded, failed dan skipped — atau status setiap entri — sebelum menganggap kelompok itu selesai.Kos Credit
skipped kerana bajet masa habis tidak dicaj, dan kelompok yang ditolak semasa pengesahan tidak dikenakan apa-apa. URL yang gagal dicaj — pengambilan telah dicuba.Apa yang Disertakan:
Sehingga 50 URL setiap panggilan, diambil secara serentak
Tajuk dan teks body setiap halaman (5,000 aksara)
Pengekstrakan medan CSS dengan nota setiap medan
Status dan kod HTTP setiap URL
Storan hasil selama 24 jam untuk get_batch_results
Cadangan Pelan:
Free Plan: 1,000 credits percubaan sekali sahaja = 200 URL
Hobby Plan: 5,000 credits = 1,000 URL ($19/mo)
Professional Plan: 50,000 credits = 10,000 URL ($99/mo)