Tomcat和搜尋引擎網路爬蟲的攻防

i042416發表於2018-09-09

不知道廣大程式設計師朋友們注意到一個現象麼?使用百度是無法搜尋到淘寶網的網頁。為什麼會造成這種現象?這就要從網路爬蟲說起了。

我們們程式設計師假如自己搭設個人網站,在上面分享少量自己的技術文章,面臨的一個重要問題就是讓搜尋引擎能夠搜尋到自己的個人網站,這樣才能讓更多的讀者訪問到。

而搜尋引擎如百度和微軟Bing搜尋,Google搜尋等通過什麼方式才能收錄我們的個人網站呢?

答案是搜尋引擎的網路爬蟲。 網路爬蟲是一個很形象的名詞,是屬於搜尋引擎的工具,只有被這些網路爬蟲“爬過”的內容才有機會出現在對應搜尋引擎的搜尋結果中。

個人站長對網路爬蟲是又愛又恨。一方面,網路爬蟲可以讓我們的個人網站出現在搜尋結果裡,對我們的個人網站進行擴散。另一方面,假如網路爬蟲太多太頻繁地訪問個人網站,會肯定程度上影響正常使使用者的請求解決。

於是就有了文章開頭我提到的百度搜不到淘寶產品資訊的文章。

在瀏覽器裡輸入 https://www.taobao.com/robots.txt

能看到淘寶網的一個檔案robots.txt:

Tomcat和搜尋引擎網路爬蟲的攻防

隨意選一段解釋:這個robots.txt的意思是,淘寶網做出了規定,假如網路請求來自百度爬蟲(Baiduspider), 那麼只允許(allow)百度爬蟲讀取article, oshtml和/ershou, 不允許讀取的是product。

User-agent: Baiduspider

Allow: /article

Allow: /oshtml

Allow: /ershou

Disallow: /product/

Disallow: /

那麼淘寶網怎樣知道一個請求是來自百度爬蟲,還是來自真正的使使用者訪問呢?答案就是HTTP請求的User-agent欄位。

下圖是我使用Chrome訪問淘寶網的HTTP請求的User-agent:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36

Tomcat和搜尋引擎網路爬蟲的攻防

再回到Tomcat。假如有大量來自網路爬蟲的讀取請求,Web伺服器需要為每一個請求創立一個session。當Session數量變得巨大時,消耗的伺服器記憶體和資源也是巨大的。

因而,Tomcat對於來自網路爬蟲的請求,用同一個session來解決。

我們開啟Tomcat的原始碼來學習。

Tomcat的原始碼可以到其官網去下載:

https://tomcat.apache.org/download-70.cgi

點這個連結:

Tomcat和搜尋引擎網路爬蟲的攻防

我下載的是7.0.90版本,只有7MB大。

這裡需要注意,即便Spider顯式的傳了一個 sessionId過來,也會棄使用,而是根據client Ip 來進行判斷,即對於 相同的 Spider 只提供一個Session。

在下載好的原始碼資料夾裡,找到這個子資料夾:\apache-tomcat-7.0.90-src\java\org\apache\catalina\valves

開啟CrawlerSessionManagerValve.java:

可以看到從第192行程式碼開始都是Tomcat使用來檢測進來的網路請求能否是網路爬蟲:

Tomcat和搜尋引擎網路爬蟲的攻防

通過這個類裡定義的正規表示式檢測HTTP請求的user-agent欄位來判斷究竟該請求能否來自網路爬蟲:

Tomcat和搜尋引擎網路爬蟲的攻防

". [bB]ot. |. Yahoo! Slurp. |. Feedfetcher-Google. "

一旦正規表示式在第205行匹配成功,將第206行的標誌位設成true。

Tomcat和搜尋引擎網路爬蟲的攻防

假如檢測到是網路爬蟲,則使用clientIdSessionId.get這個API獲取Tomcat專門為網路爬蟲預留的sessionId, 而後在第226行把該sessionId分配到進來的網路爬蟲請求,這樣就避免了白費太多的資源申請session來服務海量的網路爬蟲請求,節省了Web伺服器的資源。

Tomcat和搜尋引擎網路爬蟲的攻防

要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:


Tomcat和搜尋引擎網路爬蟲的攻防

Tomcat和搜尋引擎網路爬蟲的攻防


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2213848/,如需轉載,請註明出處,否則將追究法律責任。

相關文章