從網站地圖大量擷取網址,意思就是把單一 XML 檔案解析成一份去重複、一行一筆網址的清單 —— 而且不需要上傳檔案或執行爬蟲。Sitemap URL Extractor 會讀取貼進編輯器中的完整 <urlset> 或 <sitemapindex> 文件,從中取出每一個直接的 <loc> 值,透過瀏覽器的 WHATWG URL 解析器對每一筆進行標準化,並在單一次處理中回報根元素型別、唯一數量、重複數量以及完整輸出結果。由於解析全程在本地進行,XML 絕不會離開你的裝置,這在處理預備環境、上線前的網址清單,或不應傳送給第三方服務的私密網站地圖時特別重要。本工具是圍繞著 Sitemaps 通訊協定的兩個核心結構而打造,而非基於啟發式規則,所以貼上什麼內容,就會完整擷取什麼內容 —— 不多也不少,更不會自行猜測。它會保留首次出現的順序,去重複過程透明公開,並且每一項限制都會事先揭露,這也正是它能作為稽核證據使用、而非黑箱報告的原因。

「大量」對網站地圖網址擷取來說代表什麼
大多數網站地圖動輒數千筆網址,而大型出版商或電商網站的網站地圖,經常會突破 10,000、25,000,甚至 50,000 筆項目,才由 <sitemapindex> 將工作分散到多個同層級的檔案中。因此,大量擷取工具必須同時完成三項工作:單次讀取整份 XML 文件、將頁面網址與結構性詮釋資料分開,並誠實回報規模,不會悄悄漏掉任何項目。
這個 Sitemap URL Extractor 正是圍繞著這個對「大量」定義所設計。它會接收單一 urlset 或 sitemapindex 檔案的完整文字內容,依文件順序走訪每一個直接的 <loc> 子元素,並回傳一份去重複的清單,其長度受到明確公開的硬性上限限制,而非取決於瀏覽器恰好能容忍的程度。沒有任何會在結尾悄悄截斷的串流承諾,也沒有任何會悄悄把 sitemapindex 展開成所有引用檔案的隱藏擷取步驟。輸出結果會回報所辨識到的根元素型別、所接受的唯一數量,以及被移除的重複數量 —— 這三個數字讓規模在清單用於其他用途之前,能夠輕易地被驗證。
如何從網站地圖大量擷取網址
實際操作流程很短,但每一步都在保護結果的完整性。
- 在任何文字編輯器、瀏覽器的檢視原始碼面板,或終端機的 cat sitemap.xml 輸出中,開啟你網站地圖的 XML 原始檔。從開頭的 <?xml ... ?> 宣告(如果有的話)一路複製到結尾的 </urlset> 或 </sitemapindex> 標籤,複製整份文件。
- 將完整的 XML 文字貼進 Sitemap URL Extractor 的編輯器。不要把遠端網址貼進編輯器 —— 這個小工具不會下載任何東西,而壓縮的 .gz 檔案必須先在你的電腦上解壓縮,再貼進去。
- 執行擷取。工具會回報辨識到哪種根元素型別、接受了多少筆唯一網址,以及移除了多少筆標準化後的重複項目。首次出現的順序會被保留,所以輸出結果可以逐行對應回原始 XML。
- 將完整的一行一筆網址清單複製到剪貼簿。接著可以貼進試算表、爬蟲檢查清單、重新導向稽核、分析工具的到達頁比較,或任何其他會接收純文字網址的流程中。
- 把這份清單視為證據,而非定論。對重要的網址另外執行實際的 HTTP 狀態、標準網址、robots 與索引狀態檢查,因為擷取只能確認每個位置曾出現在貼入的結構中,並通過工具所公開的驗證。
解析器對每個項目接受與拒絕的內容
由於大量擷取的可信度取決於最薄弱的那筆 loc,解析器會對每個項目套用一組固定的規則。一致性的命名空間前置詞(例如 sm:urlset、sm:url、sm:loc)可以與預設命名空間的形式一同接受;XML 宣告與註解會被忽略;lastmod 這類選擇性子元素則不會影響擷取出的位置。每個解碼後的值接著會通過瀏覽器的 WHATWG URL 實作,它會將主機名稱轉為小寫、移除預設通訊埠,並在需要時對非 ASCII 的路徑字元進行百分號編碼。
下表摘要說明解析器接受與拒絕的內容,採用的標準與工具內部所使用的相同。
| 輸入格式 | 結果 |
|---|---|
| <urlset><url><loc>https://example.com/page</loc></url></urlset> | 接受:新增頁面網址 |
| <sitemapindex><sitemap><loc>https://example.com/sitemap-2.xml</loc></sitemap></sitemapindex> | 接受:新增網站地圖檔案網址,而非其內含頁面 |
| 使用一致 sm: 命名空間前置詞的 <urlset> | 只要前置詞一致就會接受 |
| 沒有任何 <url> 子元素的 <urlset> | |
| 含有巢狀標記的 <loc> | 拒絕 —— 該編號 loc 會造成失敗 |
| loc 內部出現 © 等未知 XML 實體 | 執行失敗 —— 僅進行保守解碼 |
| <loc>javascript:alert(1)</loc> | 拒絕 —— 僅接受 HTTP 與 HTTPS |
| <loc>https://example.com/page#section</loc> | 拒絕 —— 不允許片段識別碼 |
| <loc>https://user:[email protected]/</loc> | 拒絕 —— 不允許使用者驗證資訊 |
| 用來取代缺少之頁面 loc 的 <image:loc> | 拒絕 —— 擴充位置描述的是不同的資源 |
根據 WHATWG URL 標準,瀏覽器標準序列化是唯一套用的標準化方式,這讓去重複變得可預期。序列化後產生相同字串的兩個 loc 會被視為一筆 —— 舉例來說,https://Example.com:443/page 與 https://example.com/page 會被合併成一筆 —— 而且只會保留首次出現的那一筆。
XML 宣告與註解會被略過,但 DTD 宣告或自訂實體宣告會導致整個執行作業失敗。解析器不會修補格式錯誤的 XML、不會猜測缺少的結尾標籤應該放在哪裡,也不會悄悄略過有問題的 loc —— 每則錯誤訊息都會指出編號的 loc 或項目,方便直接修正來源。根據 Google Search Central 網站地圖指南,實體展開是正式上線的網站地圖應避免的行為;拒絕接受 DTD 可以讓小工具的行為保持精簡,並防止這項風險蔓延到工具之中。
大量處理上限:50,000 筆網址、500 萬個 UTF-16 程式碼單位,以及每筆網址 2,048 個字元
大量處理工具只有在限制明確時才算誠實。Sitemap URL Extractor 最多接受 50,000 筆唯一網址、輸入內容最多 500 萬個 UTF-16 程式碼單位,且單一序列化後的網址長度必須短於 2,048 個字元。任何一項超過上限,整個作業就會失敗,不會截斷 —— 不會有部分輸出、不會藏在綠色勾號背後的警告,也不會悄悄改寫唯一數量。
這些數字是為了對應 Sitemaps 通訊協定所記載的範圍而設定。單一網站地圖檔案最多可列出 50,000 筆網址,而未壓縮且超過 50 MB 的網站地圖則超出通訊協定明定的上限。500 萬個 UTF-16 程式碼單位約略等同於 10 MB 的 UTF-16 輸入內容(5,000,000 個程式碼單位 × 2 位元組 = 10,000,000 位元組),這為縮排、命名空間前置詞與 lastmod 值提供了有意義的餘裕空間,卻永遠不會觸及 50 MB 的通訊協定界限。如果正式上線的網站地圖接近任一上限,下一步應該是在磁碟上驗證實際未壓縮的位元組大小;本工具只能確認貼入的文字符合限制,無法確認原始檔案本身也符合。
對於網頁數量超過 50,000 筆的網站,Sitemaps 通訊協定中所描述的標準做法,是把網址清單拆分到多個網站地圖檔案,並透過網站地圖索引檔來引用每一個檔案。這個索引檔同樣可以用本工具來擷取,產生一份乾淨的網站地圖檔案網址清單,再逐一處理。接著可以個別取得每個子檔案,必要時進行解壓縮,然後分別貼入 —— 這是在網址數量達到數十萬筆時,讓稽核流程保持可追溯的最乾淨做法。
將大量網址清單用於稽核與遷移
一份乾淨、一行一筆網址的清單,幾乎適用於所有後續的 SEO 流程。把它放進試算表,與資料庫中的標準網址進行差異比對;貼進爬蟲設定檔作為種子清單;或在網域遷移時匯入重新導向對照表。把擷取出來的清單與分析工具的到達頁或上一個版本進行比對,通常是找出意外重複項目最快的方式,而這些意外重複往往來自瀏覽器標準化所凸顯的預設通訊埠或主機大小寫變體,而非網站地圖產生器的錯誤。
當下一步不是稽核現有清單,而是產生一份新清單時 —— 舉例來說,建立重新導向對照表,或是準備一份全新的網址清單 —— 由範本驅動的 Bulk URL Generator 可以從單一組 {n} 模式產生最多 10,000 筆通過驗證的網址,這與網站地圖擷取功能互補而非取代。擷取負責讀取已經宣告的內容;大量產生則負責寫入接下來需要宣告的內容。
值得再次強調這個工具所劃定的界線。擷取只能確認某個位置曾出現在貼入的結構中,並通過驗證。它並不代表該網址可被爬取、是標準網址、有價值、已被索引或具有排名。根據 Sitemaps 通訊協定與 Google 的說明文件,網站地圖只是探索的提示,而非索引的保證。請把這份清單當作更大規模稽核中的證據,執行與你決策相關的實際檢查,並把任何「已被索引」的說法,留給真正能證明這件事的工具與查詢。
延伸閱讀:在 JSON-LD 檢查器中擷取結構化資料。
延伸閱讀:大量 QR Code 產生器入門:第一步。