常见問题

蜘蛛池入口頁里的目标 URL 带一長串參數,搜尋蜘蛛會照原样抓吗?

入口頁里的目标 URL 常常带參數,搜尋蜘蛛會把不同參數当成不同地址處理,容易分散抓取、抓错地址。本文說明哪些參數最容易出問题、連結该怎么寫更稳,以及 HTML 里 & 轉义、URL 编碼這些容易忽略的细节。

常见問题

蜘蛛池入口頁里的目标 URL 带一長串參數,搜尋蜘蛛會照原样抓吗?

入口頁里挂的連結,很少是干净的一級路径,更多是带參數的動態地址,比如 detail?id=123、list?page=2&sort=new,後面再拖一段統計參數的跳轉地址。這些地址能不能被搜尋蜘蛛正常發現、它又會按哪一種形式去抓,直接决定入口頁這次有没有真正起到作用。

搜尋蜘蛛會抓带參數的 URL 吗

通常會。搜尋蜘蛛把 URL 当成字符串来看,參數不同,多數情况下就当成不同地址,除非頁面里通過 canonical 等手段明确告诉它這些地址指向同一内容。這意味着同一個目标頁,可能因為連結寫法不同,在蜘蛛那里被拆成好几個候選地址,各抓一次、各占一份抓取配額。

被抓取也不等于會被好好處理。參數越多、组合越乱,蜘蛛越难判断哪個是主地址,抓取請求也更容易被花在重复頁面或者没什么價值的參數组合上。

哪几類參數最容易出問题

  • 會话類參數:sessionid、sid、phpsessid 這類每次訪問都可能變的參數,會让同一個頁面生成出無數個 URL,蜘蛛每次爬到的地址都不一样,很难把它們归到同一個内容上。
  • 跟踪類參數:utm_source、from、spm 之類的統計參數對内容没有任何影响,却把 URL 拉長、把地址數量翻倍。
  • 排序和篩選參數:sort、order、filter 组合起来的排列數量是爆炸性的,很容易把抓取請求引到大量高度相似的頁面上。
  • 空參數和預設參數:?a=&b=&c= 這種,既不加内容也不减内容,只是让地址變長,增加判断成本。

入口頁連結怎么寫更稳妥

  1. 能静態化就静態化。伪静態地址通常比一串參數更容易被稳定识別,也方便你在日誌里對上号。
  2. 必须带參數时,固定參數顺序,把統計參數和會话參數去掉,只保留真正决定内容的那一两個。
  3. 參數不要無限组合。分類頁、篩選頁這類如果會产生成千上萬個地址,入口頁里只挂最核心的几個,別把组合结果全铺出来。
  4. 連結直接指向最终可訪問的地址。先跳到中間頁再跳一次,多了一层中轉,蜘蛛未必會一路跟到底。
  5. 同一個目标 URL 在入口頁里尽量保持同一種寫法,不要一會儿带參數、一會儿不带,让蜘蛛把它当成两個地址。

容易被忽略的 & 轉义

href 里带多個參數时一定會用到 &。在 HTML 源碼里它應该寫成 &,如果直接寫成一個裸的 &,浏览器多數时候能容错,但经過某些程序拼接、模板輸出或二次加工後,地址容易被截断或错位,蜘蛛拿到的可能是一個不完整的 URL,最後抓成 404,或者落到另一個參數组合上,白白浪費一次抓取。

带中文或特殊字符的參數值,记得做 URL 编碼。编碼不统一,同一個參數在不同連結里出現两種寫法,同样會被当成两個地址。

上线後的自查清單

  • 把入口頁源碼里的連結抽出来,看看有多少是同一路径配不同參數,參數是不是都有必要保留。
  • 對照服務器日誌,確認蜘蛛實际抓取的是不是你希望它抓的那個地址,而不是某個統計參數變体。
  • 检查入口頁里同一目标 URL 的寫法是否一致,有没有混用带參數和不带參數的版本。
  • 確認參數值是正确编碼的,& 在源碼里是 & 而不是裸寫。
入口頁解决的是“让蜘蛛發現地址”,參數乱不乱則决定“它發現的是哪一個地址”。地址越干净、越一致,後面的抓取和判断才越不容易跑偏。