Python構建網頁爬蟲理分析

NO IMAGE

既然本篇文章說到的是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 伺服器。

與許多其他系統類似,擴充套件的網路爬蟲可能比構建單個機器版本困難得多,並且在系統設計面試中可以討論許多事情。嘗試從一些樸素的解決方案開始,並繼續優化它,這可以使事情變得比看起來更容易。

以上就是我們總結的關於網頁爬蟲的相關文章內容,大家如果還有其他想知道的可以在下方的留言區域討論,感謝大家對指令碼之家的支援。

您可能感興趣的文章:

python爬蟲獲取京東手機圖片的圖文教程Python製作豆瓣圖片的爬蟲python程式設計實現12306的一個小爬蟲例項python爬蟲使用cookie登入詳解Python爬蟲獲取整個站點中的所有外部連結程式碼示例Python之Scrapy爬蟲框架安裝及簡單使用詳解Python多執行緒爬蟲實戰_爬取糗事百科段子的例項Python實現簡易Web爬蟲詳解