extract_ links
Temui dan ekstrak semua pautan daripada halaman web. Sesuai untuk penjanaan peta tapak, analisis pautan dan aliran kerja perangkakan.
Kes Penggunaan
Penjanaan Peta Tapak
Bina peta tapak menyeluruh dengan mengekstrak semua pautan dalaman
Penemuan Pautan untuk Perangkakan
Cari semua URL untuk dilawati dalam aliran kerja perangkakan web
Analisis Pautan Dalaman
Analisis struktur pautan dalaman untuk pengoptimuman SEO
Pengesanan Pautan Rosak
Cari dan sahkan semua pautan pada halaman
Endpoint
/api/v1/tools/extract_linksParameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
url | string | Optional | - | Halaman untuk diambil dan diekstrak pautannya. Sama ada `url` atau `html` diperlukan. Example: https://example.com |
html | string | Optional | - | HTML mentah untuk dihurai dan bukannya diambil. Gandingkannya dengan `base_url` supaya href relatif dapat diselesaikan. Example: <a href='/about'>About</a> |
base_url | string | Optional | - | Asas untuk menyelesaikan pautan relatif; mengatasi `<base href>` halaman itu sendiri. Semasa mengambil, `<base href>` halaman digunakan, atau `url` jika tiada; sertakannya apabila menghantar `html`. Example: https://example.com |
include_internal | boolean | Optional | true | Sertakan pautan yang menunjuk ke hos yang sama. Example: true |
include_external | boolean | Optional | true | Sertakan pautan yang menunjuk ke hos lain. Tetapkan false untuk mengekalkan pautan dalaman sahaja. Example: true |
filter_external | boolean | Optional | false | Nama yang digunakan alat MCP untuk pautan keluar sahaja: `true` sama dengan `include_internal: false`, dan mengatasinya. Ini alias, diterima supaya badan permintaan yang sama berfungsi pada kedua-dua permukaan. Ia tidak membuang pautan berjenis `other`, `anchor` atau `relative`. Example: true |
filter_domains | array | Optional | - | Kekalkan hanya pautan yang hosnya sepadan dengan salah satu domain ini. Example: ["docs.example.com"] |
include_anchors | boolean | Optional | false | Sertakan pautan serpihan semata-mata seperti `#section`. Example: false |
deduplicate | boolean | Optional | true | Gabungkan URL berulang menjadi satu entri, dibandingkan tanpa serpihan atau garis miring di hujung (`/a`, `/a/` dan `/a#x` ialah satu pautan); kemunculan pertama dikekalkan. Example: true |
include_metadata | boolean | Optional | true | Sertakan atribut `title` setiap pautan dan peta kiraan `domains`. Setiap rekod pautan tetap membawa `href`, `text`, `type`, `domain`, `rel` dan `original_href` — bentuk yang sama dikembalikan oleh alat MCP. Example: true |
respect_robots | boolean | Optional | true | Hormati robots.txt tapak sasaran. Dibiarkan pada `true`, laluan yang dilarang untuk `CrawlForge` ditolak dengan 403 sebelum apa-apa diambil dan tiada credits 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 |
escalate | boolean | Optional | false | Pilih untuk menyertai satu percubaan semula automatik melalui pelayar stealth apabila ambilan biasa `url` menemui dinding dan bukan halaman — halaman cabaran Cloudflare, Amazon, DataDome, PerimeterX, Akamai atau Vercel, 403, 429 atau 444 semata-mata, atau cengkerang kosong atau halaman ralat yang dihantar dengan 2xx. Ambilan biasa sentiasa berjalan dahulu; 404, 5xx, fail binari seperti PDF, atau hos yang tetingkap `Retry-After`-nya masih terbuka tidak pernah ditingkatkan, dan input `html` tidak pernah diambil. Pautan dibaca daripada HTML yang dipaparkan, jadi respons mempunyai bentuk yang sama, ditambah `escalated` (setiap kali parameter ini ditetapkan) dan `stealth: { engine, vendor_detected }` apabila paparan itu berjalan. Peningkatan ini menggunakan semula laluan stealth yang sama seperti [stealth_mode](/docs/api-reference/tools/stealth-mode) dan pintu robots.txt yang sama, dan tidak menambah sebarang pengendalian baharu terhadap pertahanan bot; dinding yang turut menolak paparan itu tetap kembali sebagai halaman disekat dengan `escalated: true`, tanpa caj. Menambah 5 credits, dicaj hanya apabila paparan itu benar-benar berjalan. Example: true |
escalate_engine | string | Optional | playwright | Enjin pelayar bagi peringkat peningkatan: "playwright" (lalai) atau "camoufox" (berasaskan Firefox, ketahanan pengesanan yang lebih kuat; tersedia hanya di tempat ia dipasang pada backend). Diabaikan melainkan `escalate` ialah `true` dan ambilan biasa disekat. Example: camoufox |
max_inline_chars | number | Optional | 40000 | Hasil terbesar yang dikembalikan sebaris, dalam aksara JSON-nya (1,000-10,000,000). Melebihinya, respons membawa `preview` (`max_inline_chars` aksara pertama JSON yang diformat), `result_handle`, `total_chars`, `truncated: true` dan `expires_at`, dan [read_result](/docs/api-reference/tools/read-result) membaca selebihnya dengan 1 credit setiap panggilan. Hasil tersimpan disimpan selama 1 jam. Example: 40000 |
Mengambil URL
- Halaman diambil sekali dengan had masa 15 saat. 429 atau 503 yang
Retry-After-nya 10 saat atau kurang ditunggu dahulu dan diambil sekali lagi;Retry-Afteryang lebih panjang atau tiada tidak dicuba semula. - HTML, XHTML, XML dan setiap jenis
text/*dibaca, dan respons tanpaContent-Typedibaca sebagai HTML. PDF, imej atau fail binari lain mengembalikan415 UNSUPPORTED_CONTENT_TYPEdengannext_step: "process_document"dan tidak dicaj: bacanya dengan process_document. - Badan JSON (
application/jsonatau*+json) tidak mengembalikan sebarang pautan, dengan amaranthe target returned application/json; it has no HTML links. - Halaman yang dipaparkan di sisi klien — kurang daripada 200 aksara teks yang kelihatan dan sama ada
<div id="root">,"app"atau"__next"yang kosong atau teks yang menyatakan halaman memerlukan JavaScript ("Enable JavaScript…") — berjaya denganrendered: falsedalamdatadan amaranpage renders client-side; use scrapedalamwarningsapabila tiada paparan stealth berjalan, supaya cengkerang kosong tidak disangka halaman yang pendek. Inputhtmldisemak dengan cara yang sama. - Satu panggilan berkos 1 credit. Dengan
escalate: trueunjurannya ialah siling 6 credits; 5 credits peringkat peningkatan dicaj hanya apabila ambilan biasa disekat dan peringkat itu benar-benar berjalan. Setiap kegagalan tidak dicaj.
Contoh Permintaan
cURL - Extract All Links
curl -X POST https://crawlforge.dev/api/v1/tools/extract_links \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"include_internal": true,
"include_external": false,
"deduplicate": true
}'TypeScript - Internal Links Only
// npm install crawlforge-sdk
import { CrawlForge } from 'crawlforge-sdk';
const client = new CrawlForge({ apiKey: process.env.CRAWLFORGE_API_KEY });
const result = await client.extractLinks({
url: 'https://example.com',
// Internal-only: keep include_internal, switch include_external off.
include_internal: true,
include_external: false,
deduplicate: true,
});
// result.data is untyped in crawlforge-sdk 0.1 — its shape is the Response Example below.
const { base_url, extracted_from, links } = result.data as {
base_url: string; extracted_from: string; links: unknown[];
};
console.log('Base URL:', base_url);
console.log('Extracted from:', extracted_from);
for (const link of links) console.log(link);
// Narrow to specific hosts instead of a blanket internal/external split.
const docsOnly = await client.extractLinks({
url: 'https://example.com',
filter_domains: ['docs.example.com'],
});Contoh Respons
{ "success": true, "data": { "links": [ { "href": "https://example.com/about", "text": "About", "type": "internal", "domain": "example.com", "rel": null, "original_href": "/about", "title": "About us" }, { "href": "https://example.com/products", "text": "Products", "type": "internal", "domain": "example.com", "rel": null, "original_href": "/products" }, { "href": "https://other-site.com/", "text": "External Resource", "type": "external", "domain": "other-site.com", "rel": "nofollow", "original_href": "https://other-site.com" }, { "href": "mailto:hello@example.com", "text": "Email us", "type": "other", "domain": null, "rel": null, "original_href": "mailto:hello@example.com" } ], "statistics": { "total_links": 4, "internal_links": 2, "external_links": 1, "anchor_links": 0, "relative_links": 0, "other_links": 1, "unique_domains": 2 }, "domains": { "example.com": 2, "other-site.com": 1 }, "base_url": "https://example.com", "extracted_from": "https://example.com/" }, "credits_used": 1, "credits_remaining": 999, "processing_time": 210}data.linksSetiap pautan sebagai { href, text, type, domain, rel, original_href } (+ title apabila include_metadata dihidupkan) — bentuk rekod yang sama dikembalikan oleh alat MCPdata.links[].typeinternal (hos yang sama dengan halaman), external, anchor (#serpihan, dengan include_anchors), other (mailto:, tel:, javascript: dan skema bukan web lain; href ialah null kecuali untuk mailto: dan tel:) atau relative (input html tanpa base_url)data.links[].original_hrefhref seperti yang ditulis pada halaman; href ialah URL mutlak yang telah diselesaikandata.statisticsKiraan mengikut jenis: total_links, internal_links, external_links, anchor_links, relative_links, other_links, unique_domainsdata.domainsPautan setiap domain (hanya dengan include_metadata)Pengendalian Ralat
Disekat oleh Dinding Bot (403, 444 atau 502)
Sasaran menjawab dengan halaman cabaran pertahanan bot dan bukannya kandungan, tanpa mengira status HTTP-nya. Responsnya ialah success: false dengan error.code BLOCKED, objek blocked yang menamakan vendor (contohnya cloudflare atau akamai) dan evidence yang digunakan untuk mengecamnya, serta next_step: extract_links with escalate:true, or stealth_mode operation:"scrape". Statusnya ialah status sasaran sendiri apabila ia 403, 404, 410, 429, 444 atau 451, dan 502 dalam kes lain — termasuk dinding yang dihidangkan dengan 200. Tiada credits dicaj. Dengan escalate: true dinding itu dipaparkan sekali dalam pelayar stealth; jika paparan itu juga ditolak, ralat yang sama membawa escalated: true dan tiada next_step.
Sasaran Menjawab dengan Ralat (502 Bad Gateway)
Sasaran menjawab dengan ralat HTTP tanpa dinding bot yang dikenali. error.code ialah UPSTREAM_HTTP dan mesejnya ialah Target answered HTTP <n>. 403, 404, 410, 429, 444 atau 451 dihantar terus sebagai status respons; setiap ralat lain — 5xx, atau 400 atau 401 sasaran sendiri — ialah 502, supaya ia tidak disangka sebagai masalah pada permintaan atau API key anda. 403, 429 atau 444 turut membawa next_step. Tiada credits dicaj.
Disekat oleh robots.txt (403 Forbidden)
robots.txt tapak sasaran melarang laluan ini untuk CrawlForge. Tetapkan respect_robots: false untuk mengatasinya jika anda mempunyai perjanjian sendiri dengan sasaran — tindakan mengatasi itu direkodkan pada API key anda. Tindakan mengatasi itu tidak sampai kepada hos yang berada dalam senarai penarikan diri kekal CrawlForge, yang ditolak tanpa mengira nilai respect_robots.
Jenis Kandungan Tidak Disokong (415 Unsupported Media Type)
Sasaran menghantar PDF, imej atau fail binari lain. error.code ialah UNSUPPORTED_CONTENT_TYPE, mesejnya ialah Unsupported content type <type>: extract_links reads HTML, dan next_step ialah process_document. Badannya tidak dibaca, tiada peningkatan dijalankan dan tiada credits dicaj.
Backend Peningkatan Tidak Dikonfigurasikan (503 TOOL_NOT_AVAILABLE)
escalate: true menjalankan peringkat stealth-nya pada backend pelaksanaan CrawlForge. Apabila backend itu tidak dikonfigurasikan, peringkat itu mengembalikan 503 dan tiada credits dicaj.
Alat Berkaitan
Bersedia untuk mengekstrak pautan? Daftar secara percuma dan dapatkan 1,000 credits.