【Python爬虫】2023中国大学排名爬取
- 项目思路
- 一、对项目进行分析
- 二、编写函数
- 三、测试
- 四、代码
项目思路
本代码大多参考北京理工大学嵩天老师代码,略作修改,学习其编码思想,嵩天老师中国慕课上的Python课非常不错,深入浅出,很系统
1 一个项目的编写,需要先列框架,然后再填入细节代码,将一个项目分成块,使用不同的函数
2 要符合规范,使用main函数进行调用
根据链接获取大学排名并将排名屏幕输出
一、对项目进行分析
功能描述:
输入:大学排名URL链接
输出:大学排名的屏幕输出(排名,学校名称,总分)
技术路线:requests-bs4
定向爬虫:仅对输入URL进行爬取,不扩展爬取
爬虫可行性分析:
1 确定想要的信息是否写在了源代码中,因为某些信息是通过JS动态加载的,无法使用requests-bs4获取
2 确定网站是否有robots协议(该网站无robots协议,可以爬取)
对程序结构进行初步设计:
步骤一:从网络上获取大学排名网页内容
步骤二:提取网页内容到合适的数据结构
步骤三:利用数据结构展示并输出结果
将每个步骤定义为一个函数,使程序结构清晰,可读性更好
二、编写函数
1 因为使用到网络请求,先导入库
2 因为还未对函数的内部进行实现,因此先写三个出函数的定义
3 写主函数
4 写各个函数细代码
三、测试
1 调试运行测试
2 代码优化
3 可将url中的年份换成其他,例如2020等进行尝试
四、代码
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist, html):
# 将html对象赋给BuautifulSoup类的对象soup
soup = BeautifulSoup(html, "html.parser")
# soup.prettify()
# 所有的大学排名信息在tbody标签下的tr中,每个大学单独一个tr,大学的信息在tr标签中的str中
for tr in soup.find("tbody").children:
# 排除非标签的tr
if isinstance(tr, bs4.element.Tag):
# 大学信息在tr标签中的td标签中
tds = tr("td")
# 将td标签中的内容赋值给ulist
# 使用正则表达式删除string中的换行符和空格
ulist.append([tds[0].string.replace(" ", '').replace("\n", ''), tds[1].find('a').string.replace(" ", '').replace("\n", ''), tds[4].string.replace(" ", '').replace("\n", '')]) # 目前这里存在问题,原因在于包含有校名的td标签中还有其他字符串
print(ulist)
pass
def printUnivList(ulist, num):
# 格式化输出
print("{0:^10}\t{1:^10}\t{2:^10}".format("排名", "学校名称", "分数", chr(12288)))
# 对ulist进行遍历
for i in range(num):
# 每个大学信息
u = ulist[i]
# 打印出大学信息
print("{0:^10}\t{1:^10}\t{2:^10}".format(u[0], u[1], u[2], chr(12288)))
def main():
# 大学信息列表
unifo = []
# 大学信息网链接
url = "https://www.shanghairanking.cn/rankings/bcur/202311"
# 获取网页信息
html = getHTMLText(url)
# 将html放在大学信息变量unifo中
fillUnivList(unifo, html)
# 打印大学信息
printUnivList(unifo, 20) # num = 20
main()
苟有恒,何必三更眠五更起;
最无益,莫过一日暴十日寒。
共勉!
-1-