使用Python進行網頁抓取的介紹
介紹
網頁抓取是一種重要的技術,經常在許多不同的環境中使用,尤其是數據科學和數據挖掘。 Python在很大程度上被認為是網路抓取的首選語言,其原因在於Python的內嵌電池特性。 使用Python,您可以在大約15分鐘內使用不到100行代碼創建一個簡單的抓取腳本。 因此,無論何種用途,網頁抓取都是每個Python程序員必須具備的技能。
在我們開始動手之前,我們需要退後一步,考慮什麼是網頁抓取,什麼時候應該使用它,何時避免使用它。
如您所知,網頁抓取是一種用於從網站自動提取數據的技術。 重要的是要理解,網頁抓取是一種從各種來源(通常是網頁)中提取數據的粗略技術。 如果網站的開發人員足夠慷慨地提供API來提取數據,那麼訪問數據將是一種更加穩定和健壯的方式。 因此,根據經驗,如果網站提供API以編程方式檢索其數據,請使用它。 如果API不可用,則只能使用網路抓取。
請務必遵守有關您使用的每個網站的網頁抓取的任何規則或限制,因為有些網站不允許這樣做。 有了這個清楚的認識,讓我們直接進入教程。
在本教程中,我們將抓取http://quotes.toscrape.com/,這是一個列出著名作家名言的網站。
網頁抓取管道
我們可以將web-scraping理解為包含3個組件的管道:
下載:下載HTML網頁
解析:解析HTML並檢索我們感興趣的數據
存儲:以特定格式將檢索到的數據存儲在本地計算機中
下載HTML
從網頁中提取任何數據,從邏輯上講,我們首先要下載它。 我們有兩種方法可以做到這一點:
1.使用瀏覽器自動化庫
您可以使用Selenium等瀏覽器自動化庫從網頁下載HTML。 Selenium允許您打開瀏覽器,比方說Chrome,並根據需要控制它。 您可以在瀏覽器中打開網頁,然後使用Selenium自動獲取該頁面的HTML代碼。
但是,這種方法有一個很大的缺點 - 它明顯變慢。 原因是運行瀏覽器並在瀏覽器中呈現HTML的開銷。 此方法僅應用於特殊情況 - 我們要抓取的內容在瀏覽器中使用JavaScript代碼,或者要求我們單擊按鈕/鏈接以獲取數據,Selenium可以為我們執行此操作。
2.使用HTTP庫
與第一種方法不同,HTTP庫(例如Requests模塊或Urllib)允許您發送HTTP請求,完全不需要打開任何瀏覽器。 這種方法應該始終是首選,因為它比Selenium快得多。
現在讓我告訴您如何使用Selenium和Requests庫實現管道這個組件:
使用Requests
使用以下命令安裝Requests模塊:
現在您可以在代碼中使用它,如下所示:
這裡,對URL進行HTTP GET請求,這幾乎與下載網頁同義。 然後,我們可以通過訪問requests.get方法返回的結果對象來獲取頁面的HTML源代碼。
使用Selenium
您可以通過pip安裝selenium模塊:
在這裡,我們首先創建一個表示瀏覽器的webdriver對象。 這樣做會在運行代碼的計算機上打開Chrome瀏覽器。 然後,通過調用webdriver對象的get方法,我們可以打開URL。 最後,我們通過訪問webdriver對象的page_source屬性來獲取源代碼。
在這兩種情況下,URL的HTML源都作為字元串存儲在page變數中。
解析HTML和提取數據
不必深入計算機科學理論,我們可以將解析定義為分析字元串的過程,以便我們可以理解其內容,從而輕鬆訪問其中的數據。
在Python中,有兩個庫可以幫助我們解析HTML:BeautifulSoup和Lxml。 Lxml是一個比BeautifulSoup更低級的框架,我們可以在BeautifulSoup中使用Lxml作為後端,因此對於簡單的HTML解析,BeautifulSoup將是首選的庫。
但在我們深入分析之前,我們必須分析網頁的HTML,看看我們想要抓取的數據是如何構建和定位的。只有當我們掌握了這些信息時,我們才能從解析的HTML中獲取我們想要的信息。但幸運的是,我們不必在編輯器中打開源代碼,並手動理解每個HTML元素並將其與渲染頁面中的相應數據相關聯。大多數瀏覽器都提供了一個檢查器,比如Chrome的開發人員工具,它使我們只需單擊它們即可快速查看任何元素的HTML代碼。
要在Chrome中執行此操作,請在Chrome中打開網頁,然後右鍵單擊要抓取的數據,然後選擇「檢查」。在Firefox中,此選項稱為Inspect Element - 這是在做相同的事情,但只是名稱不同。
您會注意到Chrome窗口底部打開了一個窗格,其中包含您單擊的元素的源代碼。 瀏覽一下源代碼,了解我們想要抓取的數據是如何在HTML代碼中構建的。
經過一些檢查後你可以理解,http://quotes.toscrape.com/上的每個引用都包含在一個帶有class =「quote」屬性的div中。 在該div中,引用的文本在class =「text」的範圍內,作者的名稱在class =「author」的小標籤中。 當我們實際解析HTML並提取數據時,將需要此信息。
現在,讓我們開始使用BeautifulSoup解析HTML頁面。 但首先,我們必須安裝它:
安裝好之後,可以像下面這樣在代碼中調用:
首先,我們通過將頁面傳遞給BeautifulSoup類構造函數來創建頁面的解析版本。 如您所見,我們還將第二個參數html.parser傳遞給構造函數。 這是Beautiful Soup將用於解析傳遞給它的字元串的解析器的名稱。 你可以使用我們之前談到過的解析器lxml,因為你已經安裝了Lxml庫。
然後,我們提取包含class =「quote」的頁面中的所有div標籤,因為我們知道這些是包含引用的div。 為此,Beautiful Soup 4提供了find_all功能。 我們將標記名稱和類名稱傳遞給find_all函數,並返回滿足條件的所有標記,即包含引用的標記。
這裡需要注意的一件重要事情是,我們在這裡使用樹結構。 變數soup以及引用的每個元素都是樹。 在某種程度上,引用的元素是較大的soup樹的一部分。 無論如何,為避免進入不同的討論,讓我們繼續。
我們知道引用的文本是帶有class =「text」的span標記,而作者是帶有class =「author」的小標記。 要從quote元素中提取它們,我們再次使用類似的函數find。 find函數使用與find_all函數相同的參數。 唯一的區別是它返回滿足條件的第一個標記,而find_all返回標記列表。 此外,我們希望訪問返回對象的text屬性,該對象包含該標記中包含的文本。
因此,正如您在代碼中看到的那樣,我們遍歷列表引用的所有元素,並提取引用文本和作者名稱,將它們存儲在名稱為scraped的列表。 在控制台上列印時,已抓取的列表如下所示:
存儲檢索的數據
一旦我們獲得了數據,我們就可以以任何我們想要的格式存儲它,例如CSV文件,SQL資料庫或NoSQL資料庫。 嚴格來說,這一步不應算作抓取過程的一部分,但為了完整起見,我將簡要介紹它。
我想說最流行的存儲抓取數據的方法是將它們存儲為CSV電子表格,所以我將簡要介紹如何做到這一點。 我不會詳細介紹,因為您應該參考官方的Python文檔。 所以,不用多說,讓我們看看代碼。
我們可以看到,代碼非常明顯。 我們從打開的quotes.csv文件創建一個CSV編寫器對象,然後使用writerow函數逐個寫入引用。 很明顯,writerow函數接受一個列表作為輸入,然後將其作為一行寫入CSV。
結論和後續步驟
本教程應該幫助您了解在學習自己實現簡單的scraper時基本上是什麼。 這種抓取應該足以實現簡單的自動化或小規模數據檢索。 但是如果你想有效地提取大量數據,你應該研究一下抓取框架,特別是Scrapy。 它可以幫助您使用幾行代碼編寫非常快速,高效的scraper。 無論你使用什麼樣的框架,在那個閃亮的表面下面,框架也使用這些非常基本的抓取原則,所以理解本教程應該可以幫助你為開始抓取的探險建立基礎知識。
英文原文:https://stackabuse.com/introduction-to-web-scraping-with-python/
譯者:javylee


TAG:Python部落 |