導語:今天,小Oxy要為大家帶來Pytho中Web頁面的抓取教程,跟著小Oxy往下看吧!
今天,小Oxy要為大家帶來Python中Web頁面的抓取教程,跟著小Oxy往下看吧!
大家不要看到代碼就覺得頭疼或是特別困難,其實Web爬蟲是非常簡單的。Python是面向對象的語言,而且與其他語言相比,類和對象都更容易操作,所以是Python Web爬蟲最簡單的入門方法之一。此外,還有許多庫能簡化Python Web爬蟲工具的構建流程。
這次小Oxy會概述入門所需的知識,包括如何從頁面源獲取基於文本的數據以及如何將這些數據存儲到文件中並根據設置的參數對輸出進行排序。最後,還會介紹Python Web爬蟲的高級功能。按照小Oxy今天所介紹的按部就班的學習就能學會Web爬蟲喲。
另外,小Oxy所介紹的教程適用於所有作業系統。但是,在安裝學習Python所用的環境和在正式開發環境的配置可能會稍有不同。
準備工作
這次為大家介紹的教程選用了3.8.3版本的Python,也適用於所有3.4+的版本。下面跟著小Oxy一起學習吧!
Windows系統安裝Python時,選 「PATH installation」,PATH安裝將可執行文件添加到默認的Windows命令提示符,執行文件搜索。Windows將識別諸如「pip」或「python」之類的命令,不需用戶將其指向可執行文件的目錄(例如C://tools/python//python.exe)。如果已經安裝了Python,但是沒有選中複選框,只需重新運行安裝並選擇modify。在第二個屏幕上選擇「添加到環境變量」。
庫
系統安裝後,還要使用三個重要的庫– BeautifulSoup v4,Pandas和Selenium。
BeautifulSoup廣泛用於解析HTML文件;
Pandas用於結構化數據的創建;
Selenium用於瀏覽器自動化;
安裝庫需啟動作業系統的終端。輸入:
每一次安裝都需要幾秒鐘到幾分鐘的時間。如果遇到終端死機、在下載或解壓安裝軟體包時卡住或其他問題,只要電腦尚未完全卡機,那麼可以使用CTRL+C中止安裝。
下一步教程默認安裝軟體以及庫的操作已完成。如果收到「NameError:name*is not defined」消息,很可能其中某個庫安裝失敗。
Web驅動和瀏覽器
Web爬蟲要通過瀏覽器連接到目標URL地址。出於測試目的,建議使用常規瀏覽器(或非無頭瀏覽器),尤其是新手。看到代碼與應用程式交互就能進行簡單的故障排除和調試,也有助於更好地理解整個過程。
無頭瀏覽器處理複雜任務效率更高,後續可使用。本教程使Chrome網頁瀏覽器,若選用Firefox瀏覽器,過程也相差無幾。
首先,搜索「 Chrome瀏覽器的網絡驅動程序」(或Firefox),下載適用版本。
選擇適用的軟體包下載並解壓縮。將驅動程序的可執行文件複製到易於訪問的目錄。進行之後的步驟才能知道下載安裝的操作正確與否。
編碼環境
在編程之前還需最後一步:良好的編碼環境。包括從簡單的文本編輯器到功能齊全的IDE(集成開發環境)等,其中,在簡單的文本編輯器中只需創建一個* .py文件並直接寫代碼即可。
如果已經安裝Visual Studio Code,則選擇IDE最為簡單。如果沒有,建議新手使用PyCharm,入門簡單且界面直觀。接下來教程以 PyCharm為例。
在PyCharm中右鍵單擊項目區域,單擊「新建-> Python文件」,再命名。
導入庫並使用
安裝的軟體和程序開始派上用場:
PyCharm會自動標記未使用的庫(顯示為灰色)。不建議刪除未使用的庫。
從定義瀏覽器開始,根據在「 web驅動和瀏覽器」中選擇的web驅動,應輸入:
選擇URL
Python頁面抓取需要調查的網站來源
在進行第一次測試運行前請選擇URL。小Oxy希望創建基本應用程式,因此建議選擇簡單的目標URL:
??不要將數據隱藏在Javascript元素中。有時候需要特定操作來顯示所需的數據。從Javascript元素中刪除數據則需要更複雜的操作。
??不要爬取圖像,直接利用Selenium即可。
??在進行網頁爬蟲之前,確保對象是公共數據,並且不侵犯第三方權益。另外,要查看robots.txt文件獲得指導。
選擇要訪問的登錄頁面,將URL輸入到driver.get(『URL』)參數中。Selenium要求提供連接協議。因此,始終需要在URL上附加「 http://」或「 https://」。
單擊右下角的綠色箭頭進行測試。
如果收到錯誤消息表明文件丟失,再次檢查驅動程序「 webdriver.*」中提供的路徑是否與webdriver可執行文件的位置匹配。如果收到消息表明版本不匹配,重新下載正確的webdriver可執行文件。
確定對象,建立Lists
Python允許程式設計師在不指定確切類型的情況下設計對象。只需鍵入對象的標題並指定一個值即可。
Python中的列表(Lists)有序可變,並且可重複。sets、dictionaries等集合也可使用,當然Lists更容易些。接下來,繼續學習!
在進行下一步之前,回顧一下到目前為止代碼應該是什麼樣子的:
重新運行應用程式,此時不應有錯誤提示。如出現任何問題,上文已介紹了一些故障排除的情況。
提取數據
有趣而困難的部分–從HTML文件中提取數據。幾乎在所有情況下,都是從頁面的不同部分中取出一小部分,再將其存儲到列表中。所以應先處理每個較小的部分,再將其添加到列表中:
「soup.findAll」可接受的參數範圍廣泛。本教程僅使用「arts」(屬性),可設置「如果屬性等於X為true,則……」,縮小搜索範圍,這樣就很容易找到並使用類。
在繼續下一步學習之前,在瀏覽器中訪問選定的URL。CTRL + U(Chrome)或右鍵單擊打開頁面源,選擇「查看頁面源」。找到嵌套數據「最近」的類。也可以按F12打開DevTools,選擇「元素選取器」。例如,它可以嵌套為:
屬性「class」將是「title」。如果選擇簡單的目標,則在大多數情況下,數據將以與示例類似的方式嵌套。複雜的目標可能需要更複雜繁多的操作。回歸到編碼部分,並添加原始碼中的類:
現在,循環將遍歷頁面源中所有帶有「title」類的對象。接下來是處理每一個的過程:
循環如何遍歷HTML:
第一條語句(在循環中)查找所有與標記匹配的元素,這些標記的「類」屬性包含「標題」。然後在該類中執行另一個搜索。下一個搜索將找到文檔中的所有標記(包括,不包括之類的部分匹配項)。最後,將對象賦值給變量「name」。
然後可以將對象名稱分給先前創建的列表數組「results」,但是這樣會將帶有文本的標記帶到一個元素中。大多數情況下,只需要文本本身而不需任何其他標籤。
循環將遍歷整個頁面源,找到上面列出的所有類,然後將嵌套數據追加到列表中:
注意,循環後的兩個語句是縮進的。循環需要用縮進來表示嵌套。沒有縮進的循環將輸出「IndentationError」,並用「arrow」指出有問題的語句。
輸出數據
Python頁面抓取需要對代碼進行不斷的檢查
即使在運行程序時沒有出現語法或運行錯誤,也仍然可能存在語義錯誤。應該檢查實際上是否有分配給正確對象的數據,並正確地移動到數組。
檢查在前面步驟中採集數據是否正確的最簡單方法之一是「列印」。數組有許多不同的值,通常使用簡單的循環將每個條目分隔到輸出中的單獨一行:
在這一點上,「print」和「for」都是可行的。啟動循環只是為了快速測試和調試。所以,直接列印結果是完全可行的:
到目前為止,編碼應該如下所示:
現在運行程序應不會顯示任何錯誤,並且會在調試器窗口中顯示獲取的數據。儘管「列印」非常適合用於測試,但對於解析和分析數據而言卻並非如此。
到目前為止,「import pandas」仍為灰色,最後要充分利用該庫。因為將執行類似的操作,所以建議暫時刪除「print」循環,將數據結果輸入到csv文件中。
兩個新語句依賴於pandas庫。第一條語句創建變量「 df」,並將其對象轉換為二維數據表。「Names」是列的名稱,「results」是要列印的列表。pandas可以創建多列,但目前沒有足夠的列表來利用這些參數。
第二條語句將變量「df」的數據移動到特定的文件類型(在本例中為「 csv」)。第一個參數為即將創建的文件和擴展名分配名稱。因為「pandas」輸出的文件不帶擴展名,所以需要手動添加擴展名。「index」可用於為列分配特定的起始編號。「encoding」用於以特定格式保存數據。UTF-已經幾乎適用於所有情況。
現在任何導入都不應顯示為灰色,並且能在項目目錄中輸出「names.csv」運行應用程式。如果仍有「Guessed At Parser」的警告,可通過安裝第三方解析器將其刪除。但考慮到本教程目的,默認HTML選項即可。
更多的Lists
Python頁面抓取通常需要許多數據點
許多Web爬蟲操作需獲取幾組數據。例如,僅提取電子商務網站上項目標題用處不大。為了收集有意義的信息並從中得出結論,至少需要兩個數據點。
當然,小Oxy還將介紹一些稍有不同的方法。因為從同一類中獲取數據僅意味著附加到另一個列表,所以應嘗試從另一類中提取數據,但同時要維持表的結構。
顯然,需要另一個列表來儲存數據。
由於要從HTML的不同部分提取額外的數據點,所以需要額外的循環。如有必要還可添加另一個「If」條件來控制重複條目:
最後,需要更改數據表的形成方式:
到目前為止,我們代碼的最新迭代應如下所示:
幸運的話,運行此代碼時不會輸出錯誤。但在某些情況下,「pandas」將輸出「ValueError:arrays must be same length」消息。簡而言之,列表「results」和「other_results」的長度是不相等的,因此pandas不能創建二維表。
有很多方法可以解決此問題,比如用「empty」值填充最短列表或創建字典,再創建兩個序列並將它們列出。現在,有第三個方法:
列表的長度不一,則不會匹配數據,如果需要兩個數據點,則創建兩個序列是最簡單的解決方法。最終代碼應該如下:
創建一個名為「names」的csv文件,其中包括兩列數據,然後再運行。
高級功能
現在,Web爬蟲應該可以正常使用了。當然,這個爬蟲非常基礎簡單,需要升級才能執行複雜的數據採集。在學習更複雜的教程之前,建議嘗試其他功能:創建循環從而創建長度相等的列表,匹配數據提取。
很多方法能一次爬取數個URL。最簡單的方法之一是重複上面的代碼,每次都更改URL,但這種操作很煩。所以,構建循環和要訪問的URL數組即可。
創建多個數組存儲不同的數據集,並將其輸出到不同行的文件中。一次收集幾種不同類型的信息對電子商務獲取數據而言很重要。
Web爬蟲工具自動運行,無需操作。採用Chrome或Firefox瀏覽器的無頭版本,減少加載時間。
創建爬蟲模式。思考普通用戶如何瀏覽網際網路並嘗試自動化的過程。這肯定需要新的庫。用「import time」和「from random import randint」創建頁面之間的等待時間。添加「scrollto()」或使用特定的鍵控制滾動條。創建爬蟲模式時,幾乎不可能列出所有可能的選項。
創建監控流程。某些網站上的數據可能對時間(甚至用戶)敏感。創建長時間循環,重新檢查某些url並按設置的間隔爬取數據,確保數據的時效性。
最後,將代理集成到web爬蟲,通過特定位置的使用許可獲取可能無法訪問的數據。
接下來內容就要靠大家自學了。構建web爬蟲、獲取數據並從大量信息中得出結論,這個過程有趣又複雜。當然,如果想了解更多有關代理或高級數據採集工具如何工作的信息,可以點擊閱讀原文查看我們的博客哦!博客上還有更詳細的教程指南、避免爬蟲時數據擁堵以及代理方面的知識和文章!如果覺得我們的文章有用,記得點「在看」支持我們哦!
(文章為作者獨立觀點,不代表艾瑞網立場)