這個例子是小編今天在中國大學MOOC(北京理工大學)上學習的時候寫下來的。但是很快寫完之後我就發現不對勁,首先課程給的例子是中國好大學網站的排名,但是現在這個網站已經重構了,原來的連結進去是軟科的大學排名,所以之前的代碼就需要做一些修改,在我不懈的努力下,現在基本成功了,寫這篇博客記錄一下。
連結:https://www.shanghairanking.cn/rankings/bcur/2020.
本例爬取的是下圖的排名、大學名稱、總分三個內容。
這一部分嵩天老師在課中給出了講解,這裡我整理分享給大家。
輸入:大學排名URL連結
輸出:大學排名信息的屏幕輸出(排名,大學名稱,總分)
技術路線:requests–bs4
定向爬蟲:僅對輸入URL進行爬取,不擴展爬取
註:requestts和bs4庫的使用只能獲取靜態頁面的信息,如何獲取動態頁面信息,我會在後邊專門寫篇文章詳細說明
步驟一:從網絡上獲取大學排名網頁內容:定義函數getHTMLText()
步驟二:提取網頁內容中信息到合適的數據結構:定義函數fillUnivList()
步驟三:利用數據結構展示並輸出結果:定義函數printUnivList()
在編寫函數前,首先我們要先看一下網頁的原始碼
通過對網頁原始碼的觀察,我們可以看到,所有大學信息被封裝在一個表格中,這個表格的標籤叫tbody,在tbody中,每個大學的信息被封裝在一個標籤中,這個標籤叫tr,每個tr標籤裡又有一個td標籤,每個大學的具體信息就被這個標籤包圍,但是大學的名字是被包在a標籤中的,這裡要做處理。
所以我們首先遍歷tbody標籤,獲得所有大學信息,然後在tbody標籤中找到tr標籤,獲得每個大學信息,最後在tr標籤裡找到td標籤,把我們需要的相關數據寫在我們的ulist列表中。
註:
1.由於大學名稱被a標籤包含,所以我們可以定義一個列表存放a標籤內容(與td標籤區別開)。
2.為了視覺方面更加美觀,可採用中文字符的空格填充 chr(12288),其實就是為了對齊。
從網絡上獲取大學排名網頁內容。
def getHTMLText(url):#獲取URL信息,輸出內容 try: r = requests.get(url,timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return""
提取網頁內容中信息到合適的數據結構.
def fillUnivList(ulist,html):#將html頁面放到ulist列表中(核心) soup = BeautifulSoup(html,"html.parser") for tr in soup.find('tbody').children: if isinstance(tr,bs4.element.Tag):#如果tr標籤的類型不是bs4庫中定義的tag類型,則過濾掉 a = tr('a')#將所有的a標籤存為一個列表類型 tds = tr('td')#將所有的td標籤存為一個列表類型 ulist.append([tds[0].string.strip(),a[0].string.strip(),tds[4].string.strip()])
註:這裡要注意的是,要注意使用strip()函數,它的作用是用於移除字符串頭尾指定的字符(默認為空格或換行符)或字符序列。但該方法只能刪除開頭或是結尾的字符,不能刪除中間部分的字符。用在此處可以使爬取的內容,在格式化輸出時達到對齊的效果。
利用數據結構展示並輸出結果:定義函數。
def printUnivList(ulist1,num):#列印出ulist列表的信息,num表示希望將列表中的多少個元素列印出來 #格式化輸出 tplt = "{0:^10}\t{1:{3}^12}\t{2:^10}" # 0、1、2為槽,{3}表示若寬度不夠,使用format的3號位置處的chr(12288)(中文空格)進行填充 print(tplt.format("排名","學校名稱","總分",chr(12288))) for i in range(num): u = ulist1[i] print(tplt.format(u[0], u[1], u[2],chr(12288))) print() print("共有記錄"+str(num)+"條")#2020最新python學習資源分享:1156465813
多說一句,很多人學Python過程中會遇到各種煩惱問題,沒有人解答容易放棄。小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並在後臺私信小編:「01」即可領取。
'''功能描述:輸入:大學排名URL輸出:大學排名信息的屏幕輸出(排名,大學名稱,總分)技術路線:requests—bs4(只能獲取靜態頁面信息)定向爬蟲:僅對輸入URL進行爬取,不擴展爬取程序的結構設計:1.從網絡上獲取大學排名網頁內容:定義函數getHTMLText()2.提取網頁內容中信息到合適的數據結構:定義函數fillUnivList()3.利用數據結構展示並輸出結果:定義函數printUnivList()'''import requestsfrom bs4 import BeautifulSoupimport bs4ulist1=[]def getHTMLText(url):#獲取URL信息,輸出內容 try: r = requests.get(url,timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return""def fillUnivList(ulist,html):#將html頁面放到ulist列表中(核心) soup = BeautifulSoup(html,"html.parser") for tr in soup.find('tbody').children: if isinstance(tr,bs4.element.Tag):#如果tr標籤的類型不是bs4庫中定義的tag類型,則過濾掉 a = tr('a') tds = tr('td')#將所有的td標籤存為一個列表類型 ulist.append([tds[0].string.strip(),a[0].string.strip(),tds[4].string.strip()])def printUnivList(ulist1,num):#列印出ulist列表的信息,num表示希望將列表中的多少個元素列印出來 #格式化輸出 tplt = "{0:^10}\t{1:{3}^12}\t{2:^10}" # 0、1、2為槽,{3}表示若寬度不夠,使用format的3號位置處的chr(12288)(中文空格)進行填充 print(tplt.format("排名","學校名稱","總分",chr(12288))) for i in range(num): u = ulist1[i] print(tplt.format(u[0], u[1], u[2],chr(12288))) print() print("共有記錄"+str(num)+"條")def main(): uinfo = [] #將大學信息放到列表中 url = "https://www.shanghairanking.cn/rankings/bcur/2020" html = getHTMLText(url) fillUnivList(uinfo,html) printUnivList(uinfo,10)main()
輸出效果如下圖:
本篇完,如有錯誤歡迎指出~
中國大學MOOC Python網絡爬蟲與信息提取
https://www.icourse163.org/course/BIT-1001870001