Langkau ke kandungan
Alat Asas1 credit

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

POST/api/v1/tools/extract_links
Auth Required
1 req/s pada pelan Free
1 credit

Parameters

NameTypeRequiredDefaultDescription
url
stringOptional-
Halaman untuk diambil dan diekstrak pautannya. Sama ada `url` atau `html` diperlukan.
Example: https://example.com
html
stringOptional-
HTML mentah untuk dihurai dan bukannya diambil. Gandingkannya dengan `base_url` supaya href relatif dapat diselesaikan.
Example: <a href='/about'>About</a>
base_url
stringOptional-
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
booleanOptionaltrue
Sertakan pautan yang menunjuk ke hos yang sama.
Example: true
include_external
booleanOptionaltrue
Sertakan pautan yang menunjuk ke hos lain. Tetapkan false untuk mengekalkan pautan dalaman sahaja.
Example: true
filter_external
booleanOptionalfalse
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
arrayOptional-
Kekalkan hanya pautan yang hosnya sepadan dengan salah satu domain ini.
Example: ["docs.example.com"]
include_anchors
booleanOptionalfalse
Sertakan pautan serpihan semata-mata seperti `#section`.
Example: false
deduplicate
booleanOptionaltrue
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
booleanOptionaltrue
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
booleanOptionaltrue
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
booleanOptionalfalse
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
stringOptionalplaywright
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
numberOptional40000
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-After yang lebih panjang atau tiada tidak dicuba semula.
  • HTML, XHTML, XML dan setiap jenis text/* dibaca, dan respons tanpa Content-Type dibaca sebagai HTML. PDF, imej atau fail binari lain mengembalikan 415 UNSUPPORTED_CONTENT_TYPE dengan next_step: "process_document" dan tidak dicaj: bacanya dengan process_document.
  • Badan JSON (application/json atau *+json) tidak mengembalikan sebarang pautan, dengan amaran the 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 dengan rendered: false dalam data dan amaran page renders client-side; use scrape dalam warnings apabila tiada paparan stealth berjalan, supaya cengkerang kosong tidak disangka halaman yang pendek. Input html disemak dengan cara yang sama.
  • Satu panggilan berkos 1 credit. Dengan escalate: true unjurannya 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

terminalBash
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

extractLinks.tsTypescript
// 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

200 OK210ms
{
"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
}
Field Descriptions
data.linksSetiap pautan sebagai { href, text, type, domain, rel, original_href } (+ title apabila include_metadata dihidupkan) — bentuk rekod yang sama dikembalikan oleh alat MCP
data.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 diselesaikan
data.statisticsKiraan mengikut jenis: total_links, internal_links, external_links, anchor_links, relative_links, other_links, unique_domains
data.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