一款完全在瀏覽器中運作的連結萃取器 API 替代方案,會解析貼上的 HTML、針對選填的 HTTP 或 HTTPS 基準 URL 解析相對路徑,並在每一行回傳一個去除重複的目標網址,且不會將你的來源、基準 URL 或發現的目的地下載端點傳送到任何第三方。從依賴下載端點的服務轉為頁面內解析器,省去了逐次呼叫的計價、API 金鑰與帳號流程、速率限制排隊,也省去了那個安靜的隱私問題——遠端服務會拿你提交的 URL 做什麼。因為所有運作都在你已經能取得的 HTML 上本機執行,這個工具很適合例行的 SEO 稽核、內容遷移、結構檢視,以及安全性抽查——這些情境下你已經握有標記,只需要一份乾淨的清單。其權衡一樣清楚:本機來源解析器無法主動解析短網址、評估 HTTP 狀態、跟隨重新導向、執行 JavaScript,或標示哪些目標屬於內部、外部,因此這些工作仍須交給你自行授權的可控爬蟲。

團隊選擇離開連結萃取器 API 的原因
依賴下載端點的連結萃取服務會按次計費、以帳號限制存取,並悄悄地把你的輸入 HTML 與其中的 URL 在網路上傳遞。在小量使用時這種摩擦感並不明顯;但到了稽核規模——每次遷移要審視數百個頁面、每個版本要檢查數十個範本,或每週工單討論串中會貼上數十段片段——按次計數器、請求紀錄、排隊時間就會變成操作性瓶頸。團隊也會發現,連結萃取器 API 回傳的欄位(原始文字、解碼後的實體、標準化的協定、基準 URL 的解讀方式)會因廠商而異,所以專案中途更換下載端點意味著要在稽核試算表中重新對應欄位。
本機替代方案能迴避上述每一項困擾,因為解析器是針對你已經透過可控方法取得的 HTML 來執行。從瀏覽器的「檢視原始碼」對話框複製的網頁原始碼、你的爬蟲所儲存的 HTML,或你的 CMS 匯出的標記,都不會離開這個頁面。不需要輪換的 API 金鑰、沒有每月帳單、也不會有在團隊趕上線時程時悄悄限流的速率限制。唯一值得先說在前面的權衡是:解析器無法憑空生出沒拿到的資料,它只能處理你手上已經有的來源。
瀏覽器內替代方案在實務上的差異
頁面內連結萃取器接受貼上的 HTML 與選填的基準 URL,然後在畫面上顯示去除重複的結果,以及不重複、重複、跳過項目的計數。相較於 API 工作流程,可見的行為差異體現在三個具體面向:
- 輸入形式。你提供一段 HTML,而不是讓服務去擷取的目標 URL。這個工具不會向遠端伺服器索取文件本身。
- 基準 URL 處理。當你填入絕對的 HTTP 或 HTTPS 頁面網址時,根相對、路徑相對、父層相對,以及協定相對的值都會依據該網址解析。當你將該欄位留空時,那些值會保持相對,因此輸出永遠不會憑空捏造主機。
- 輸出格式。你會以第一次出現的順序逐行取得 URL,並搭配透明的計數器顯示過濾掉哪些內容,而不是與每呼叫計價綁定的分頁 JSON 信封。
連結萃取器遵循這個契約:掃描起始標籤中的 href 屬性、標準化網頁、郵件與電話連結、在標準化之後去除重複,同時略過可執行的協定,並回報過程中略過的目標數量。
從貼上的 HTML 中萃取連結
下方的工作流程使用連結萃取器,並假設你已擁有經授權可檢視的 HTML,無論是從「檢視原始碼」複製、由你自己的爬蟲下載,或從你可控的 CMS 匯出所得到。
- 將經授權的 HTML 原始碼貼入輸入區。若標記中含有像 /pricing 或 ../guide 的值,請同時在基準 URL 欄位填入該原始碼實際呈現時所在的絕對頁面網址。
- 執行萃取。工具會掃描起始標籤、標準化 href 值、依據所提供的基準解析任何相對項目,並捨棄可執行的協定。
- 檢視計數器。不重複、重複與略過的數量會揭示輸入是如何被縮減的;若略過數量能加以解釋,那麼看似偏短的清單通常不是漏抓連結的瑕疵。
- 將逐行結果複製到你的稽核表、遷移待辦清單或爬蟲種子清單中,並將原始來源檔案保留在旁以便日後比對。
- 另外使用你能控管的爬蟲,獨立驗證狀態碼、重新導向鏈結、rel 屬性的意義,以及任何動態插入的連結,因為靜態來源解析只是清單而非健全性報告。
若貼上的 HTML 來自 DevTools 複製,內容同時包含渲染後的標記與 script 區塊中的片段,那麼解析器會在掃描前先移除常見的原始文字容器,例如 script、style、iframe 與 title,因此 JavaScript 內部形似錨點的字串不會被誤判為連結。這也是為什麼在靜態來源的檢視中,「從檢視原始碼貼上」通常比「從 DevTools 貼上」產生更乾淨的稽核結果。
本機解析器過濾了哪些內容以及原因
過濾是多數團隊在讀到略過計數之前最容易低估的部分。解析器會移除一組定義明確的、屬於不安全、無效或對連結清單沒有助益的 href 值,並把數字顯示出來,因此不會有任何隱藏。
| 類別 | 範例 | 過濾原因 |
|---|---|---|
| 可執行的協定 | javascript:、data:、vbscript: | 在爬蟲內部跟隨這些項目可能會觸發指令稿或渲染內嵌的有效負載。 |
| 空白與自我參照 | href=""、href="#section" | 這些是同一份文件內部的導覽提示,並非可爬取的目標。 |
| 無效的絕對 URL | 格式錯誤的協定或授權區段 | 無法解析的清單目標會浪費爬取額度並干擾下游工具。 |
| 含有憑證的基準 | https://user:pass@host/ | 基準 URL 必須不含憑證,這樣使用者資料才不會被回填到每筆解析結果中。 |
郵件與電話類型的目標會刻意保留,因為它們是連結清單中合法的目的端;頁尾的聯絡連結仍然屬於連結圖的一部分。數字字元參考與一小組命名實體會經過解碼,以便一般查詢字串的跳脫在輸出中能清楚閱讀;去除重複只在標準化之後執行,因此兩個解析後指向同一絕對 URL 的相同相對路徑會合併為一筆,同時保留第一次出現的順序。標準化之後的去重是嚴格比對,並不會宣稱差異僅在追蹤參數、片段、大小寫路徑或重新導向行為的 URL 代表同一資源。輸入上限為 200,000 字元,以維持互動式掃描在可控範圍內,因此非常大的文件應先切割或預先過濾後再進行解析。
來源解析器的侷限所在
了解限制才能讓結果誠實。完全在本機運作的連結萃取器 API 替代方案無法做到下列事項:
- 擷取任何已萃取的 URL 來檢查狀態、重新導向鏈結或標準化宣告。
- 執行 JavaScript,因此單頁應用程式在掛載後才插入的連結不會出現在靜態來源中。
- 標示目標屬於內部或外部、解讀像 nofollow 或 sponsored 這類 rel 屬性,或判定清單中的目標是否為標準化、preload 或 stylesheet。
- 在處理嚴重格式錯亂的標記時比有界掃描做得更好,因為未加引號的屬性與缺少的原始文字結束標籤,會使解析器所看到的內容與真實瀏覽器 DOM 不同。
針對這些檢查,請將去除重複後的清單交給經授權的爬蟲,或將萃取結果與 DevTools 匯出的 DOM 進行比對。將解析後的清單視為庫存,然後再驗證。一次稽核的簡單流程如下:貼上來源、提供基準 URL、執行解析器、複製逐行結果,接著將清單交給可控的爬蟲;關於該流程的完整逐步示範,請參閱從網頁原始碼萃取所有 URL 以進行 SEO 稽核指南。靜態來源解析回傳的是庫存,真正的爬蟲則把庫存轉化為證據。
API 工作流程與本機解析器一覽對照
下方表格就多數團隊在決定是否捨棄以端點為基礎的萃取時所考量的面向,比較這兩種工作流程。
| 面向 | 連結萃取器 API | 本機來源解析器 |
|---|---|---|
| 提供給服務的輸入 | 通常是目標 URL,有時是 HTML | 你已握有的貼上 HTML |
| 是否需要帳號與 API 金鑰 | 是,且需要輪換與配額追蹤 | 否 |
| 逐次呼叫成本 | 依每次請求或每個擷取的 URL 計費 | 無 |
| 對清單中目的地的網路呼叫 | 經常發出 HEAD 或 GET 請求 | 從不,因為不會聯繫目的地 URL |
| 離開瀏覽器的資料 | HTML 加上其中的每個 URL,再加上你的憑證 | 無 |
| 速率限制與排隊 | 依服務等級強制施行 | 僅受限於你的機器 |
| 相對 URL 解析 | 取決於端點的契約 | 選填的 HTTP 或 HTTPS 基準 URL,且不含憑證 |
| 輸出形式 | 與 SKU 綁定的 JSON 或分頁信封 | 逐行一個去除重複的 URL,並附上透明計數 |
| 動態 DOM 連結 | 視後端而定,有時可支援 | 否,因為僅解析靜態來源標記 |
| 狀態、重新導向與 rel 檢查 | 通常綁在同一呼叫中 | 超出範圍,因此結果需搭配經授權的爬蟲 |
本機解析器勝出的列——包括隱私、成本以及免排隊的可擴展性——正是促使團隊遠離端點的相同理由。API 傳統上勝出的列,也就是擷取頁面與讀取回應的那些項目,同時也是這次轉換明確交棒的地方:貼上你自己的 HTML,再以你自行操作的工具加以驗證。
想進一步了解,請參閱Mac 上的批次 QR Code 產生器:本機瀏覽器工作流程。