- Python數據分析從入門到精通
- 李梓萌編著
- 2197字
- 2020-09-18 18:05:48
3.2 開發簡單的網絡爬蟲應用程序

在本節內容中,將通過幾個簡單實例讓讀者了解開發簡易網絡爬蟲應用程序的方法,為后面綜合實戰項目的學習打下基礎。
3.2.1 爬蟲抓取某高校教師信息
實例文件jiao.py的功能,使用BeautifulSoup抓取某大學計算機與控制工程學院教師信息。教師列表頁面的URL網址是http://computer.域名主頁.edu.cn/news/?c=teacher&a=teacherlist,如圖3-1所示。

圖3-1 某大學官網計算機與控制工程學院教師信息
我們要抓取上述網頁中所有教師的姓名信息和學位信息,打開谷歌瀏覽器按〈F12〉鍵進入調試模式,找到中間顯示教師信息的對應源碼(每一名教師信息的實現源碼都相同),具體源碼如下圖3-2所示。

圖3-2 顯示教師信息的源碼
由于我們想要抓取的是教師姓名和學位,所以,需要提取的源碼信息有如下兩個。
● lea_name下的第一個選項值。
● lea_js下的call選項值。
另外,上述教師信息頁面采用了分頁顯示模式,具體源碼如圖3-3所示。因此要抓取完整的教師信息,還需要對分頁模式進行處理。

圖3-3 分頁顯示模式
編寫實例文件jiao.py,具體實現代碼如下所示。
源碼路徑:daima\3\3-1\jiao.py


通過上述代碼會抓取并打印輸出所有分頁中的教師姓名信息和學位信息,執行后會輸出抓取的教師信息:



3.2.2 抓取某吧的信息
本實例文件tieba.py的功能是抓取某吧中某個帖子的信息,具體說明如下所示。
源碼路徑:daima\3\3-2\tieba.py
● 對某吧的任意帖子進行抓取。
● 設置是否只抓取樓主發帖內容。
● 將抓取到的內容分析并保存到指定的記事本文件中。
(1)確定URL并抓取頁面代碼
我們的目標是抓取某吧中的指定帖子:http://tieba.域名主頁.com/p/4931694016,下面對其分析。
● tieba.xxx.com:是某吧的二級域名,指向某吧的服務器。
● /p/4931694016:是服務器某個資源,即這個帖子的地址定位符。
● see_lz和pn:表示該URL的兩個參數,see_lz表示只看樓主,pn表示帖子頁碼,等于1表示該條件為真。
針對某吧的地址,可以把URL分為兩部分:一部分為基礎部分,一部分為參數部分。例如,上面的URL的基礎部分是http://tieba.域名主頁.com/p/4931694016,參數部分是?see_lz=1&pn=1。
(2)抓取頁面
熟悉了抓取URL的格式后,接下來開始用urllib庫來抓取頁面中的內容。其中,有些帖子指定給程序是否要只看樓主,所以把只看樓主的參數初始化放在類的初始化上,即init方法。另外,獲取指定頁碼帖子的號數也傳入該方法中。
(3)提取帖子標題
提取帖子的標題,只需在瀏覽器中審查元素,或者按〈F12〉鍵,查看頁面源代碼,找到標題所在的代碼段即可,如下所示。

若要提取<h1>標簽中的內容,由于h1標簽太多,所以需要指定class確定唯一。正則表達式代碼如下所示。

(4)提取帖子頁數
帖子總頁數功能可通過分析頁面中共多少頁元素來獲取。獲取帖子總頁數的方法如下所示。

(5)提取正文內容
通過審查元素可以看到,在某吧每一層樓的主要內容都在<div id=”post_content_xxxx”></div>標簽里面,所以可以編寫如下所示的正則表達式代碼。

獲取頁面所有樓層數據的實現代碼如下所示。

(6)編寫工具類Tool
編寫工具類Tool對抓取的文本進行處理,也就是把各種各樣復雜的標簽剔除掉,還原精華內容。為了實現代碼重用,將標簽處理功能定義為類Tool,然后里面定義方法replace()替換各種標簽。在類Tool中使用正則表達式技術實現標簽過濾,如使用re.sub()方法對文本進行匹配替換。類Tool的具體實現代碼如下所示。


到此為止,整個實例介紹完畢。實例文件tieba.py的主要實現代碼如下所示。



執行后程序提示輸入一個帖子的地址,如輸入“4931694016”,然后詢問“是否只獲取樓主發言”和“是否寫入樓層信息”。執行效果如圖3-4所示。

圖3-4 執行效果
在實例文件tieba.py的同級目錄下生成一個與帖子標題相同的記事本文件“穆帥:半場休息時,我告訴拉什福德別在意浪費掉的機會!!.txt”,雙擊打開,會發現在里面存儲了抓取的帖子“http://tieba.域名主頁.com/p/4931694016”中的內容,如圖3-5所示。

圖3-5 抓取的內容
3.2.3 抓取XX百科
本實例文件baike.py能夠抓取XX百科網站中的熱門信息,具體功能如下所示。
● 抓取XX百科熱門段子。
● 過濾帶有圖片的段子。
● 每按〈Enter〉鍵一次,顯示一個段子的發布時間、發布人、段子內容和點贊數。
源碼路徑:daima\3\3-3\baike.py
(1)確定URL并抓取頁面代碼。
首先確定頁面URL是http://www.域名主頁.com/hot/page/1,其中,最后一個數字1代表當前的頁數,可以傳入不同的值來獲得某一頁的段子內容。編寫代碼設置要抓取的目標首頁和user_agent值,具體實現代碼如下所示。

執行后會打印輸出第一頁的HTML代碼。
(2)提取某一頁的所有段子。
獲取HTML代碼后,開始獲取某一頁的所有段子。首先審查一下元素,然后按瀏覽器的〈F12〉鍵,如圖3-6所示。

圖3-6 http://www.域名主頁.com/hot/的源碼
由此可見,每一個段子都是被<div class="articleGender manIcon">…</div>包含的內容。若要獲取頁面中的發布人、發布日期、段子內容以及點贊個數,需要刪除帶有圖片的段子,確保只保存只含文本的段子。為了實現這一功能,使用正則表達式方法re.findall()尋找所有匹配的內容。編寫的正則表達式匹配語句如下所示。

上述正則表達式是整個程序的核心,本實例的實現文件是baike.py,具體實現代碼如下所示。



執行效果如圖3-7所示,每按〈Enter〉鍵就會顯示下一條熱門段子信息。

圖3-7 執行效果
3.2.4 爬蟲抓取某網站的信息并保存到本地
本實例是使用BeautifulSoup抓取某網站中關鍵字為“小說”的文章信息,并將抓取到的信息保存到本地記事本文件中。編寫實例文件article.py的具體思路如下所示:
1)在程序中設置兩層循環,其中外循環用于逐個訪問不同的頁數,內循環用于逐個訪問當前頁面內的不同文章。
2)當內循環進入文章后,通過正則表達式依次獲取文章標題、作者、譯者和文章主體等信息。
3)每當內循環獲取到一篇文章,就采用追加的方式將抓取到的信息寫入指定的記事本文件中。
文件Spider_Guokr_article.py的具體實現代碼如下所示。
源碼路徑:daima\3\3-4\article.py



抓取目標網站中關鍵字為“小說”的文章信息,并將抓取的信息保存到本地記事本文件中,如圖3-8所示。

圖3-8 抓取文章到并保存到本地記事本文件