Tomcat和搜尋引擎網路爬蟲的攻防
不知道廣大程式設計師朋友們注意到一個現象麼?使用百度是無法搜尋到淘寶網的網頁。為什麼會造成這種現象?這就要從網路爬蟲說起了。
我們們程式設計師假如自己搭設個人網站,在上面分享少量自己的技術文章,面臨的一個重要問題就是讓搜尋引擎能夠搜尋到自己的個人網站,這樣才能讓更多的讀者訪問到。
而搜尋引擎如百度和微軟Bing搜尋,Google搜尋等通過什麼方式才能收錄我們的個人網站呢?
答案是搜尋引擎的網路爬蟲。 網路爬蟲是一個很形象的名詞,是屬於搜尋引擎的工具,只有被這些網路爬蟲“爬過”的內容才有機會出現在對應搜尋引擎的搜尋結果中。
個人站長對網路爬蟲是又愛又恨。一方面,網路爬蟲可以讓我們的個人網站出現在搜尋結果裡,對我們的個人網站進行擴散。另一方面,假如網路爬蟲太多太頻繁地訪問個人網站,會肯定程度上影響正常使使用者的請求解決。
於是就有了文章開頭我提到的百度搜不到淘寶產品資訊的文章。
在瀏覽器裡輸入 https://www.taobao.com/robots.txt ,
能看到淘寶網的一個檔案robots.txt:
隨意選一段解釋:這個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。假如有大量來自網路爬蟲的讀取請求,Web伺服器需要為每一個請求創立一個session。當Session數量變得巨大時,消耗的伺服器記憶體和資源也是巨大的。
因而,Tomcat對於來自網路爬蟲的請求,用同一個session來解決。
我們開啟Tomcat的原始碼來學習。
Tomcat的原始碼可以到其官網去下載:
https://tomcat.apache.org/download-70.cgi
點這個連結:
我下載的是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使用來檢測進來的網路請求能否是網路爬蟲:
通過這個類裡定義的正規表示式檢測HTTP請求的user-agent欄位來判斷究竟該請求能否來自網路爬蟲:
". [bB]ot. |. Yahoo! Slurp. |. Feedfetcher-Google. "
一旦正規表示式在第205行匹配成功,將第206行的標誌位設成true。
假如檢測到是網路爬蟲,則使用clientIdSessionId.get這個API獲取Tomcat專門為網路爬蟲預留的sessionId, 而後在第226行把該sessionId分配到進來的網路爬蟲請求,這樣就避免了白費太多的資源申請session來服務海量的網路爬蟲請求,節省了Web伺服器的資源。
要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2213848/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用robots禁止各大搜尋引擎爬蟲爬取網站爬蟲網站
- Web網站如何檢視搜尋引擎蜘蛛爬蟲的行為Web網站爬蟲
- laravel 簡單限制搜尋引擎爬蟲頻率Laravel爬蟲
- Python爬蟲全網搜尋並下載音樂Python爬蟲
- 用開源搜尋引擎定製你的網際網路
- 各大網際網路巨頭的搜尋引擎交鋒PGB
- 搜尋引擎-03-搜尋引擎原理
- 搜狗搜尋微信Python爬蟲案例Python爬蟲
- Flutter 網路搜尋引擎SEO最佳化友好Flutter
- 網路爬蟲爬蟲
- 127盤搜網 網盤資源搜尋引擎
- 網路爬蟲的原理爬蟲
- 網路爬蟲——爬蟲實戰(一)爬蟲
- 海量資料搜尋---搜尋引擎
- 網路偵察技術(一)搜尋引擎資訊收集
- 各類主流網盤搜尋引擎
- 什麼是Python網路爬蟲?常見的網路爬蟲有哪些?Python爬蟲
- 網路爬蟲示例爬蟲
- 網路爬蟲精要爬蟲
- 網路爬蟲的反扒策略爬蟲
- 高效的使用搜尋引擎
- python 寫的搜尋引擎Python
- python網路爬蟲_Python爬蟲:30個小時搞定Python網路爬蟲視訊教程Python爬蟲
- python網路爬蟲應用_python網路爬蟲應用實戰Python爬蟲
- Nebula 基於 ElasticSearch 的全文搜尋引擎的文字搜尋Elasticsearch
- 限制IP到全流程防控,講解網路爬蟲與技術反爬的動態攻防爬蟲
- 搜尋引擎es-分詞與搜尋分詞
- 用elasticsearch和nuxtjs搭建bt搜尋引擎ElasticsearchUXJS
- 文字獲取和搜尋引擎簡介
- python DHT網路爬蟲Python爬蟲
- 網路爬蟲專案爬蟲
- sphinx 全文搜尋引擎
- 高效利用搜尋引擎
- ElasticSearch全文搜尋引擎Elasticsearch
- [Python] 網路爬蟲與資訊提取(1) 網路爬蟲之規則Python爬蟲
- 爬蟲的小技巧之–如何尋找爬蟲入口爬蟲
- 知乎搜尋/(引擎)的故事
- python網路爬蟲(14)使用Scrapy搭建爬蟲框架Python爬蟲框架