天天看點

如何用 Python 實作 Web 抓取?

如何用 Python 實作 Web 抓取?

随着電子商務的蓬勃發展,筆者近年越來越着迷于比價應用。我在網絡上(甚至線下)的每次購買,都是在各大電商網站深入調研後的結果。

筆者常用的比價應用包括:redlaser, shopsavvy 以及 buyhatke。這些應用有效提高了價格透明度,進而為消費者節省了可觀的時間。

但是,你是否想過,這些應用如何得到那些重要資料?通常,它們會借助 web 抓取技術來完成該任務。

web 抓取是抽取網絡資料的過程。隻要借助合适的工具,任何你能看到的資料都可以進行抽取。在本文中,我們将重點介紹自動化抽取過程的程式,幫助你在較短時間内收集大量資料。除了筆者前文提到的用例,抓取技術的用途還包括:seo 追蹤、工作追蹤、新聞分析以及筆者的最愛——社交媒體的情感分析!

當你打開網絡中的某個站點時,就會下載下傳其 html 代碼,由你的 web 浏覽器對其進行分析與展示。該 html 代碼包含了你所看到的所有資訊。是以,通過分析 html 代碼就能得到所需資訊(比如價格)。你可以使用正規表達式在資料海洋中搜尋你需要的資訊,也可以使用函數庫來解釋 html,同樣也能得到需要資料。

安裝完成之後,我們大緻會遵循以下步驟實作 web 抓取:

向 url 發送請求

接收響應

分析響應以尋找所需資料

作為示範,我們将使用筆者的部落格 <code>http://dada.theblogbowl.in/</code>. 作為目标 url。

前兩個步驟相對簡單,可以這樣完成:

接下來,将響應傳給之前安裝的子產品:

在将 html 傳給 beautifulsoup 之後,我們可以嘗試一些指令。譬如,檢查 html 标記代碼是否正确,可以驗證該頁面的标題(在 python 解釋器中):

接下來,開始抽取頁面中的特定元素。譬如,我想抽取部落格中文章标題的清單。為此,我需要分析 html 的結構,這一點可以借助 chrome 檢查器完成。其他浏覽器也提供了類似的工具。

如何用 Python 實作 Web 抓取?

使用 chrome 檢查器檢查某個頁面的 html 結構

如你所見,所有文章标題都帶有 <code>h3</code> 标簽與兩個類屬性:<code>post-title</code> 與 <code>entry-title</code> 類。是以,用 <code>post-title</code> 類搜尋所有 <code>h3</code> 元素就能得到該頁的文章标題清單。在此例中,我們使用 beautifulsoup 提供的 <code>find_all</code> 函數,并通過 <code>class_</code> 參數确定所需的類:

隻通過 <code>post-title</code> 類進行條目搜尋應該可以得到相同的結果:

如果你想進一步了解條目所指的連結,可以運作下面的代碼:

beautifulsoup 内置了許多方法,可以幫助你玩轉 html。其中一些方法列舉如下:

目前為止,我們做的隻是下載下傳一個頁面進而分析其内容。然而,web 開發者可能屏蔽了非浏覽器發出的請求,或者有些網站内容隻能在登入之後讀取。那麼,我們該如何處理這些情況呢?

對于第一種情況,我們需要在向頁面發送請求時模拟一個浏覽器。每個 http 請求都包含一些相關的資料頭(header),其中包含了訪客浏覽器、作業系統以及螢幕大小之類的資訊。我們可以改變這些資料頭,僞裝為浏覽器發送請求。

至于第二種情況,為了通路帶有訪客限制的内容,我們需要登入該網站,使用 cookie 保持會話。下面,讓我們來看看在僞裝成浏覽器的同時,如何完成這一點。

我們将借助 <code>cookielib</code> 子產品使用 cookie 管理會話。此外,我們還将用到 <code>mechanize</code>,後者可以使用 pip 之類的安裝程式進行安裝。

如何用 Python 實作 Web 抓取?

通知頁面的結構

如何用 Python 實作 Web 抓取?

登入進通知頁面後的結果

許多開發者會告訴你:你在網絡上看到的任何資訊都可以被抓取。通過這篇文章,你學會了如何輕松抽取登入後才能看到的内容。此外,如果你的 ip 遭到了屏蔽,你可以掩蓋自己的 ip 位址(或選用其他位址)。同時,為了看起來像是人類在通路,你應該在請求之間保留一定的時間間隔。

随着人們對資料的需求不斷增長,web 抓取(不論原因好壞)技術在未來的應用隻會更加廣泛。也是以,了解其原理是相當重要的,不管你是為了有效利用該技術,還是為了免受其坑害。