中国大学排名爬虫分析
作者:互联网
中国大学排名爬虫分析
爬虫:按照一定的规则,自动抓取互联网信息的程序或者脚本,从而获取对于我们有价值的信息。
本文内容是编写一个简单的爬虫,爬取软科大学网上的中国大学排名信息,并进行简单分析。
程序功能描述:
1.屏幕输出大学排名信息,包括排名、大学名称、综合总分。
2.分析2019年、2020年大学排名变化情况
用到的python库:
requests、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 ("")
步骤二:提取网页内容中所需关键信息
如图,可以看到,查看HTML源码发现每一所大学都在tbody
标签中,这里一个tr
表示一所大学。
步骤三:对获取的排名信息进行文本分析。
通过fillUnivList()
函数,得到了各个大学排名及分数,然后使用printUnivList()
函数输出大学排名。
def fillUnivList(udict, html):
# 将有用的信息提取出来,并保存到字典udict中
# udict结构:{大学名称:[排名, 大学名称, 综合分数]}
soup = BeautifulSoup(html,"html.parser")
print("正在获取大学排名...")
try:
soup = BeautifulSoup(html, "html.parser")
trs = soup.find('tbody').find_all('tr')
for tr in trs:
tds = tr.find_all('td')
rank = tds[0].get_text().replace('\n', '').replace(' ', '') # 排名
name = tds[1].find('a').get_text() # 大学名称
score = tds[4].get_text().replace('\n', '').replace(' ', '') # 分数
udict[name] = [rank, name, score]
print("成功获取大学排名!")
except:
print("获取大学排名失败!")
分析2019年、2020年大学排名变化,printUnivList()
函数代码优化如下:
def printUnivList(dict1, dict2, num):
title_tplt = "{0:^5}\t{1:{4}^10}\t{2:^10}\t{3:^10}"
tplt = "{0:^5}\t{1:{4}^10}\t{2:^12}\t{3:^13}"
print(title_tplt.format("排名", "学校名称", "综合分数", "上升/下降", chr(12288)))
for key in list(dict1.keys())[:num]:
u = dict1[key]
# 今年排名与去年的变化diff
diff = int(u[0]) - int(dict2[key][0])
if diff > 0:
change = "↓" + str(diff)
elif diff == 0:
change = " 0"
else:
change = "↑" + str(-diff)
print(tplt.format(u[0], u[1], u[2], change, chr(12288)))
分析结果:
从排名变化可以看出,排名前十的大学几乎没有变化。
完整代码如下:
# collegeRankChange.py
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(udict, html):
# 将有用的信息提取出来,并保存到列表ulist中
soup = BeautifulSoup(html,"html.parser")
print("正在获取大学排名...")
try:
soup = BeautifulSoup(html, "html.parser")
trs = soup.find('tbody').find_all('tr')
for tr in trs:
tds = tr.find_all('td')
rank = tds[0].get_text().replace('\n', '').replace(' ', '')
name = tds[1].find('a').get_text()
score = tds[4].get_text().replace('\n', '').replace(' ', '')
udict[name] = [rank, name, score]
print("成功获取大学排名!")
except:
print("获取大学排名失败!")
def printUnivList(dict1, dict2, num):
title_tplt = "{0:^5}\t{1:{4}^10}\t{2:^10}\t{3:^10}"
tplt = "{0:^5}\t{1:{4}^10}\t{2:^12}\t{3:^13}"
print(title_tplt.format("排名", "学校名称", "综合分数", "上升/下降", chr(12288)))
for key in list(dict1.keys())[:num]:
u = dict1[key]
diff = int(u[0]) - int(dict2[key][0])
if diff > 0:
change = "↓" + str(diff)
elif diff == 0:
change = " 0"
else:
change = "↑" + str(-diff)
print(tplt.format(u[0], u[1], u[2], change, chr(12288)))
def main():
uinfo_2019 = {}
uinfo_2018 = {}
url_2018 = 'https://www.shanghairanking.cn/rankings/bcur/201811'
url_2019 = 'https://www.shanghairanking.cn/rankings/bcur/201911'
html_2019 = getHTMLText(url_2019)
fillUnivList(uinfo_2019, html_2019)
html_2018 = getHTMLText(url_2018)
fillUnivList(uinfo_2018, html_2018)
n = int(input("请输入你要查询大学的数量:"))
print("\n2020年排名前", n, "的大学:\n")
printUnivList(uinfo_2019, uinfo_2018, n)
if __name__ == "__main__":
main()
标签:大学排名,text,爬虫,html,2019,排名,print,中国大学,diff 来源: https://blog.csdn.net/weixin_44420593/article/details/111563098