爬虫实例:中国大学排名定向爬虫(中国大学MOOC-BIT Python网络爬虫与信息提取)

功能描述

输入:大学排名URL链接
输出:大学排名信息的屏幕输出(排名,大学名称,总分)
技术路线:requests-bs4
定向爬虫:仅对输入URL进行爬取,不扩展爬取。

1、先确定可行性

利用此方法只能爬取静态网页,即我们所需要的内容写在了html中
查看robots协议,此网页没有对爬虫进行限制

2、程序的结构设计

步骤1:从网络上获取大学排名网页内容 getHTMLText()
步骤2:提取网页内容中信息到合适的数据结构 fillUnivList()
步骤3:利用数据结构展示并输出结果 printUnivList()
此图是网页的源代码,tbody下包含tr,tr下包含td爬虫实例:中国大学排名定向爬虫(中国大学MOOC-BIT Python网络爬虫与信息提取)_第1张图片

3、代码实现

import requests
from bs4 import BeautifulSoup
import bs4

#通过requests库中的get方法返回网页的html代码
def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status() #异常捕获
        r.encoding = r.apparent_encoding #改变编码格式
        return r.text
    except:
        return "产生异常"
#将传入的html通过bs4库解析和提取所需内容并放入一个列表中
def fillUnivList(ulist , html):
    soup = BeautifulSoup(html, "html.parser") #html转soup
    for tr in soup.find('tbody').children : #遍历tbody下的子节点
        if isinstance(tr, bs4.element.Tag): #类型判断,过滤出Tag类型节点
            tds = tr('td') #将tr中的td标签拿出来组成一个tds列表
            ulist.append([tds[0].string ,tds[1].string, tds[4].string]) #将列表中的所需元素添加到一个空列表

#格式化输出列表中的内容,只打印20个
def printUnivList(ulist, num):
    print("{:^10}\t{:^6}\t{:^10}".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():
    unifo = []
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming-zongbang-2020.html'
    html = getHTMLText(url)
    fillUnivList(unifo, html)
    printUnivList(unifo , 20) #20Univ

main()

Output:
    排名    	 学校名称 	    总分    
    1     	 清华大学 	  852.5   
    2     	 北京大学 	  746.7   
    3     	 浙江大学 	  649.2   
    4     	上海交通大学	  625.9   
    5     	 南京大学 	  566.1   
    6     	 复旦大学 	  556.7   
    7     	中国科学技术大学	  526.4   
    8     	华中科技大学	  497.7   
    9     	 武汉大学 	  488.0   
    10    	 中山大学 	  457.2   
    11    	西安交通大学	  452.5   
    12    	哈尔滨工业大学	  450.2   
    13    	北京航空航天大学	  445.1   
    14    	北京师范大学	  440.9   
    15    	 同济大学 	  439.0   
    16    	 四川大学 	  435.7   
    17    	 东南大学 	  432.7   
    18    	中国人民大学	  409.7   
    19    	 南开大学 	  402.1   
    20    	北京理工大学	  395.6   
Suc20

4、优化

优化中英文输出时的格式问题
可以看到中间学校名称项没有对齐,原因是当中文字符串长度没有达到指定字符串长度时,默认会采用英文空格代替,而英文空格和中文空格长度不同,故导致中英文混输时不对齐了。:采用chr(12288)表示中文空格

def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"#第二项指定用format中的序号为3的对象来占空白,因使用了下标,故都要添加下标
    print( tplt.format("排名","学校名称", "总分",chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2],chr(12288)))
Output:
    排名    	   学校名称   	    总分    
    1     	   清华大学   	  852.5   
    2     	   北京大学   	  746.7   
    3     	   浙江大学   	  649.2   
    4     	  上海交通大学  	  625.9   
    5     	   南京大学   	  566.1   
    6     	   复旦大学   	  556.7   
    7     	 中国科学技术大学 	  526.4   
    8     	  华中科技大学  	  497.7   
    9     	   武汉大学   	  488.0   
    10    	   中山大学   	  457.2   
    11    	  西安交通大学  	  452.5   
    12    	 哈尔滨工业大学  	  450.2   
    13    	 北京航空航天大学 	  445.1   
    14    	  北京师范大学  	  440.9   
    15    	   同济大学   	  439.0   
    16    	   四川大学   	  435.7   
    17    	   东南大学   	  432.7   
    18    	  中国人民大学  	  409.7   
    19    	   南开大学   	  402.1   
    20    	  北京理工大学  	  395.6 

你可能感兴趣的:(爬虫实例:中国大学排名定向爬虫(中国大学MOOC-BIT Python网络爬虫与信息提取))