Python爬蟲學習日誌(6)

實例1:中國大學排名定向爬蟲

編寫爬蟲

1.分析

  1. 最好大學網
    2019中國大學排名:http://www.zuihaodaxue.com/Greater_China_Ranking2019_0.html

  2. 功能描述

  • 輸入:大學排名URL連接

  • 輸出:大學排名信息(排名,大學名稱,總分)

  • 技術路線:requests-bs4

  • 定向爬蟲:僅對輸入URL進行爬取,不擴展爬取

  1. 爬蟲步驟
  • 步驟1:從網絡上獲取大學排名網頁內容。getHTMLText()
  • 步驟2:提取網頁內容中信息到合適的數據結構。fillUnivList()
  • 步驟3:利用數據結構展示並輸出結果。printUnivList()

2.源代碼

  1. 網頁信息
  • tbody -> tr -> td
    在這裏插入圖片描述
  1. 程序代碼
  • 先定義函數,寫好程序總體框架。
  • 再對每個函數的內容依次編寫。
    在這裏插入圖片描述
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(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):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody'): #for tr in soup.find('tbody').children:時報錯
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string,tds[1].string,tds[2].string])
    pass

def printUnivList(ulist, num):
    print("{:^10}\t{:^6}\t{:^10}".format("排名","學校名稱","地域"))#使用槽和format將信息對應
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
    print("Suc" + str(num))

def main():
    uinfo = []
    url = "http://www.zuihaodaxue.com/Greater_China_Ranking2019_0.html"
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)#只爬取前20所大學

main()
  1. 輸出結果:
    排名    	 學校名稱 	    地域    
    1     	清華大學(北京)	    大陸    
    2     	 北京大學 	    大陸    
    3     	香港中文大學	    香港    
    4     	 浙江大學 	    大陸    
    5     	 香港大學 	    香港    
    6     	中國科學技術大學	    大陸    
    7     	上海交通大學	    大陸    
    8     	 復旦大學 	    大陸    
    9     	清華大學(新竹)	    臺灣    
    10    	 臺灣大學 	    臺灣    
    11    	北京師範大學	    大陸    
    12    	香港城市大學	    香港    
    13    	香港科技大學	    香港    
    14    	 南京大學 	    大陸    
    15    	華中科技大學	    大陸    
    16    	中山大學(廣州)	    大陸    
    17    	香港理工大學	    香港    
    18    	交通大學(新竹)	    臺灣    
    19    	哈爾濱工業大學	    大陸    
    20    	澳門科技大學	    澳門    
Suc20

3.程序優化

  1. 中文對齊問題
    在這裏插入圖片描述
  2. 解決方法
  • 用中字字符的空格填充

  • chr(12288)表示中文字符空格

    修改部分:

def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}" #填充時使用format的第三個變量填充
    print(tplt.format("排名","學校名稱","地域",chr(12288)))#{3}:chr(12288)代表中文字符空格
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0],u[1],u[2],chr(12288)))
    print("Suc" + str(num))
  1. 輸出結果
 排名    	   學校名稱   	    地域    
    1     	 清華大學(北京) 	    大陸    
    2     	   北京大學   	    大陸    
    3     	  香港中文大學  	    香港    
    4     	   浙江大學   	    大陸    
    5     	   香港大學   	    香港    
    6     	 中國科學技術大學 	    大陸    
    7     	  上海交通大學  	    大陸    
    8     	   復旦大學   	    大陸    
    9     	 清華大學(新竹) 	    臺灣    
    10    	   臺灣大學   	    臺灣    
    11    	  北京師範大學  	    大陸    
    12    	  香港城市大學  	    香港    
    13    	  香港科技大學  	    香港    
    14    	   南京大學   	    大陸    
    15    	  華中科技大學  	    大陸    
    16    	 中山大學(廣州) 	    大陸    
    17    	  香港理工大學  	    香港    
    18    	 交通大學(新竹) 	    臺灣    
    19    	 哈爾濱工業大學  	    大陸    
    20    	  澳門科技大學  	    澳門    
Suc20
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章