软科大学排名爬取(可运行) Python网络爬虫与信息提取(北京理工大学—嵩天)

先贴代码

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').children:
        #find('tbody')函数,搜索name=‘tbody’的标签,只返回一个结果,即tbody标签(Tag类型的对象)
        #....children得到tbody的所有子标签的迭代类型
        if isinstance(tr,bs4.element.Tag):#如果子标签的类型不是Tag类型,就去掉
            a = tr('a')#以列表类型返回所有的‘a’标签
            tds = tr('td')#以列表类型返回所有的‘td’标签,其中第一个td标签包含排名信息,第五个td标签包含分数信息
            ulist.append([tds[0].string.strip(), a[0].string.strip(), tds[4].string.strip()])
            #td标签的string属性里存有所需信息,strip()函数跳过字符串里的空格
            
def printUnivList(ulist1,num):#num表示要将列表中的多少个学校信息打印出来
    tplt = "{0:^10}\t{1:{3}^12}\t{2:^10}"
    # 0、1、2作用为“排名","学校名称","总分"三个字符串分别放在第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)))

def main():
    uinfo = [] #将大学信息放到列表中
    url = "https://www.shanghairanking.cn/rankings/bcur/2020"
    html = getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivList(uinfo,30)#因为只读取了第一页的url链接,所以最多只能读取30个学校(ps:换到第二页url链接没有发生变化,页面源码依然只有前三十个学校...疑惑.jpg)

main()

这个程序是我在上课后,收集资料+改写+参考别人代码得到的最终版本,关于代码的解释基本全都放在了注释部分

参考资料:

format函数:(3条消息) Python的format格式化输出_硬曲奇小屋-CSDN博客_python格式化输出format

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