bs4实例-爬取2021软科中国大学排名

程序描述:

输入: url链接 权威发布|2021软科中国大学专业排名||就业前景|就业率

输出: 排名信息的屏幕输出

技术路线:requests-bs4定向爬虫

如果信息没有写在代码中,则不能被用来定向,所以我们要检查以下源代码里面是不是有这些信息

bs4实例-爬取2021软科中国大学排名_第1张图片

 

首先获取排名网页内容,getHTMLText()

提取信息到合适的数据结构,fillUnivList()

利用数据结构展示和输出,printUnivList()

首先它的格式

 
 
   
   
 
 
   
    19    
 
 
       
   
     
                 
   
   

     一流大学A类/985/211    

   
 
 
   南京市  
 
   55.5  
 
 
 
   
    A+    
   
    学校条件    
 
 
   
    B+    
   
    学科支撑    
 
 
   
    A+    
   
    专业生源    
 
 
   
    A+    
   
    专业就业    
 
 
   
    A    
   
    专业条件    
 
 

所有大学的信息都在

里面,

单个大学的信息封装在

里面,

其中,排名信息在

中,

大学信息在

中,

我们最后要打印的效果类似这样

bs4实例-爬取2021软科中国大学排名_第2张图片

 

最终确定我们要筛选的为:

Tag = 'div', attrs = 'ranking'

Tag = 'a', attrs = 'name-cn'

Tag = 'div', attrs = 'score'

给出提取的代码

def fillUnivList(ulist,html): # 将提取的html信息放在列表ulist中
    soup = BeautifulSoup(html, 'html.parser')
    # print(soup.find('div',attrs = 'body-container').prettify())
    # 这个print用于检查格式,确定层级
    for div in soup.find_all('div',attrs = 'univ-item'): 
        # 从每个'univitem'中,提取NaviagbleString,并转换为合适的格式
        ranking = int(div.find('div',attrs = 'ranking').string)
        name = div.find('a',attrs = 'name-cn').string
        score = float(div.find('div',attrs = 'score').string)
        ulist.append([ranking,name,score])

最后所有的代码如下

import requests
from bs4 import BeautifulSoup
​
def getHTMLText(url): # 获取URL信息,返回html内容
    try: 
        r = requests.get(url, timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "HTMLError"
    
    
def fillUnivList(ulist,html): # 将提取的html信息放在列表ulist中
    soup = BeautifulSoup(html, 'html.parser')
    print(soup.find('div',attrs = 'body-container').prettify())
    for div in soup.find_all('div',attrs = 'univ-item'):
        ranking = int(div.find('div',attrs = 'ranking').string)
        name = div.find('a',attrs = 'name-cn').string
        score = float(div.find('div',attrs = 'score').string)
        ulist.append([ranking,name,score])
​
​
def printUnivList(ulist,num): # 将ulist打印
    templete_string = "{0:^10}\t{1:{3}<12}\t{2:^10}\t"
    # 中文字符utf-8编码空格为 chr(12288)
    print(templete_string.format('排名','大学','总分',chr(12288)))
    for i in range(num):
        univ = ulist[i]
        print(templete_string.format(univ[0],univ[1],univ[2], chr(12288)))
    print("Suc")
    
​
def main():
    uinfo = []
    url = 'https://www.shanghairanking.cn/rankings/bcmr/2021/080901'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    # print(uinfo)
    printUnivList(uinfo, 10) # only 10 univ
    
main()

你可能感兴趣的:(python,爬虫)