既然本篇文章說到的是Python構建網頁爬蟲原理分析,那么小編先給大家看一下Python中關于爬蟲的精選文章:
python實現簡單爬蟲功能的示例
python爬蟲實戰之最簡單的網頁爬蟲教程
網絡爬蟲是當今最常用的系統之一。最流行的例子是 Google 使用爬蟲從所有網站收集信息。除了搜索引擎之外,新聞網站還需要爬蟲來聚合數據源。看來,只要你想聚合大量的信息,你可以考慮使用爬蟲。
建立一個網絡爬蟲有很多因素,特別是當你想擴展系統時。這就是為什么這已經成為最流行的系統設計面試問題之一。在這篇文章中,我們將討論從基本爬蟲到大型爬蟲的主題,并討論在面試中可能會遇到的各種問題。
1 - 基本解決方案
如何建立一個基本的網絡爬蟲?
在系統設計面試之前,我們已經在《系統設計面試之前需要知道的八件事》中談到,就是從簡單的東西開始。讓我們專注于構建在單線程上運行的基本網頁爬蟲。有了這個簡單的解決方案,我們可以繼續優化。
要抓取單個網頁,我們只需要向相應的 URL 發出 HTTP GET 請求,并解析響應數據,這是抓取工具的核心。考慮到這一點,一個基本的網絡爬蟲可以這樣工作:
以包含我們要抓取的所有網站的網址池開始。
對于每個 URL,發出 HTTP GET 請求來獲取網頁內容。
解析內容(通常為 HTML)并提取我們想要抓取的潛在網址。
添加新的網址到池中,并不斷抓取。
這取決于具體問題,有時我們可能會有一個獨立的系統來生成抓取網址。例如,一個程序可以不斷監聽 RSS 訂閱,并且對于每個新文章,都可以將該 URL 添加到爬取池中。
2 - 規模問題
眾所周知,任何系統在擴展后都會面臨一系列問題。在網絡爬蟲中,將系統擴展到多臺機器時,有很多東西可能出錯。
在跳轉到下一節之前,請花幾分鐘的時間思考一下分布式網絡爬蟲的瓶頸,以及如何解決這個問題。在這篇文章的其余部分,我們將討論解決方案的幾個主要問題。
3 - 抓取頻率
你多久爬一次網站?
這聽起來可能不是什么大事,除非系統達到一定的規模,而且你需要非常新鮮的內容。例如,如果你想要獲取上一小時的最新消息,則抓取工具可能需要每隔一小時不斷抓取新聞網站。但是這有什么問題呢?
對于一些小型網站,他們的服務器很可能無法處理這種頻繁的請求。一種方法是遵循每個站點的robot.txt。對于不知道robot.txt是什么的人,這基本是網站與網絡爬蟲交流的標準。它可以指定不應該抓取什么文件,大多數網絡爬蟲都遵循配置。另外,你可以為不同的網站設置不同的抓取頻率。通常,每天只有幾個網站需要被多次抓取。
4 - 去重
在一臺機器上,你可以將 URL 池保留在內存中,并刪除重復的條目。但是,分布式系統中的事情變得更加復雜。基本上,多個爬蟲可以從不同的網頁中提取相同的 URL,他們都希望將這個 URL 添加到 URL 池中。當然,多次抓取同一頁面是沒有意義的。那么我們如何去重復這些網址?
一種常用的方法是使用 Bloom Filter。簡而言之,布隆過濾器是一個節省空間的系統,它允許你測試一個元素是否在一個集合中。但是,它可能有誤報。換句話說,如果布隆過濾器可以告訴你一個 URL 絕對不在池中,或者可能在池中。
為了簡要地解釋布隆過濾器是如何工作的,空布隆過濾器是m位(全0)的位數組。還有k個散列函數,將每個元素映射到m位中的一個。所以當我們在布隆過濾器中添加一個新的元素(URL)時,我們將從哈希函數中得到k位,并將它們全部設置為1.因此,當我們檢查一個元素的存在時,我們首先得到k位,如果它們中的任何一個不是1,我們立即知道該元素不存在。但是,如果所有的k位都是1,這可能來自其他幾個元素的組合。
布隆過濾器是一個非常常用的技術,它是一個完美的解決方案,用于在網絡爬蟲中去重網址。
5 - 解析
從網站獲取響應數據后,下一步是解析數據(通常是 HTML)來提取我們所關心的信息。這聽起來像一個簡單的事情,但是,可能很難使其健壯。
我們面臨的挑戰是,你總是會在 HTML 代碼中發現奇怪的標記,URL 等,很難涵蓋所有的邊界情況。例如,當 HTML 包含非 Unicode 字符時,你可能需要處理編解碼問題。另外,當網頁包含圖片,視頻甚至PDF 時,也會造成奇怪的行為。
另外,一些網頁都像使用 AngularJS 一樣通過 Javascript 呈現,你的抓取工具可能無法得到任何內容。
我會說沒有銀彈,不能為所有的網頁做一個完美的,健壯的爬蟲。你需要大量的健壯性測試,以確保它能夠按預期工作。
總結
還有很多我還沒有涉及到的有趣的話題,但是我想提一下其中的一些,這樣你就可以思考了。有一件事是檢測循環。許多網站包含鏈接,如A->B->C->A,你的爬蟲可能會永遠運行。想想如何解決這個問題?
另一個問題是 DNS 查找。當系統擴展到一定的水平時,DNS 查找可能是一個瓶頸,你可能要建立自己的 DNS 服務器。
與許多其他系統類似,擴展的網絡爬蟲可能比構建單個機器版本困難得多,并且在系統設計面試中可以討論許多事情。嘗試從一些樸素的解決方案開始,并繼續優化它,這可以使事情變得比看起來更容易。
以上就是我們總結的關于網頁爬蟲的相關文章內容,大家如果還有其他想知道的可以在下方的留言區域討論,感謝大家對腳本之家的支持。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
