1. 学习视频
中国大学排名定向爬虫:
- https://www.bilibili.com/video/BV1pt41137qK?p=33&spm_id_from=pageDriver
2. 程序设计
输入:https://www.shanghairanking.cn/rankings/bcur/2021
输出:大学排名信息的打印(排名、大学名称、总分)
技术路线:requests-bs4
定向爬虫:仅对输入URL进行爬取,不拓展爬取
- 从网络上获取大学排名网页内容
- 提取网页内容中资讯到合适的资料结构
- 利用资料结构展开并输出结果
3. 需求
获取该网页的排行信息
4. 网页源代码查看大学信息的节点
先找到 tbody 标签,获取所有大学
再找到 tr 标签,获取具体大学
最后找到 td,获取大学详情
先找到 tbody 标签,获取所有大学
再找到 tr 标签,获取具体大学
最后找到 td,获取大学详情
<tbody data-v-6885f26d>
<tr data-v-6885f26d>
<td data-v-6885f26d>
<div class="ranking top1" data-v-6885f26d>1</div>
</td>
<td class="align-left" data-v-6885f26d>
<div class="univname-container" data-v-6885f26d>
<div class="logo" data-v-6885f26d>
<img alt="清华大学" one rror='this.src="/images/blank.svg"' src="https://www.shanghairanking.cn/_uni/logo/27532357.png" class="univ-logo" data-v-6885f26d>
</div>
<div class="univname" data-v-6885f26d>
<div data-v-b80b4d60 data-v-6885f26d>
<div class="tooltip" data-v-b80b4d60>
<div class="link-container" data-v-b80b4d60>
<a
href="/institution/tsinghua-university" class="name-cn" data-v-b80b4d60>清华大学
</a>
<div
class="collection" style="display:none" data-v-b80b4d60><img src="/_nuxt/img/uncollection.5e124aa.svg" alt data-v-b80b4d60>
</div>
</div>
</div>
</div>
<div data-v-f9104fdc data-v-6885f26d>
<div class="tooltip" data-v-f9104fdc>
<div class="link-container" data-v-f9104fdc>
<a
href="/institution/tsinghua-university" class="name-en" data-v-f9104fdc>Tsinghua University
</a>
</div>
</div>
</div>
</td>
<td data-v-6885f26d>北京</td>
<td data-v-6885f26d>综合</td>
<td data-v-6885f26d>969.2</td>
<td data-v-6885f26d>37.9</td>
</tr>
5. 代码示例
import requests
from bs4 import BeautifulSoup
import bs4
"""
中国大学排名定向爬虫:https://www.bilibili.com/video/BV1pt41137qK?p=33&spm_id_from=pageDriver
输入:https://www.shanghairanking.cn/rankings/bcur/2021
输出:大学排名信息的打印(排名、大学名称、总分)
技术路线:requests-bs4
定向爬虫:仅对输入URL进行爬取,不拓展爬取
程序设计
1. 从网络上获取大学排名网页内容
2. 提取网页内容中资讯到合适的资料结构
3. 利用资料结构展开并输出结果
"""
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
return ""
# 提取HTML关键信息,决议出大学名称,排名,分数
def fillUnivList(list, html):
soup = BeautifulSoup(html, "html.parser")
# 1. 先找到 tbody 标签,获取所有大学
for tr in soup.find('tbody').children:
# 2. 再找到 tr 标签,获取具体大学
if isinstance(tr, bs4.element.Tag):
# 3. 最后找到 td,获取大学详情
tds = tr('td')
uRank = tds[0].string.replace('\n', "").strip() # 去除换行符和空格
uName = tds[1].div.a.string.replace('\n', "").strip()
uScore = tds[4].string.replace('\n', "").strip()
list.append([uRank, uName, uScore])
def printList(list, num):
mFormat = "{0:^10}\t{1:^10}\t{2:^15}"
print(mFormat.format("排名", "学校名称", "总分"), chr(12288))
for i in range(num):
info = list[i]
print(mFormat.format(info[0], info[1], info[2]), chr(12288))
if __name__ == '__main__':
list = []
url = "https://www.shanghairanking.cn/rankings/bcur/2021"
html = getHTMLText(url)
fillUnivList(list, html)
# 列出20所大学的排名信息
printList(list, 20)
6. 运行结果
对照结果和网页的实际显示,查看结果为一致
C:\Users\珞落\AppData\Local\Programs\Python\Python39\python.exe D:/PythonProject/main.py
排名 学校名称 总分
1 清华大学 969.2
2 北京大学 855.3
3 浙江大学 768.7
4 上海交通大学 723.4
5 南京大学 654.8
6 复旦大学 649.7
7 中国科学技术大学 577
8 华中科技大学 574.3
9 武汉大学 567.9
10 西安交通大学 537.9
11 哈尔滨工业大学 522.6
12 中山大学 519.3
13 北京师范大学 518.3
14 四川大学 516.6
15 北京航空航天大学 513.8
16 同济大学 508.3
17 东南大学 488.1
18 中国人民大学 487.8
19 北京理工大学 474
20 南开大学 465.3
Process finished with exit code 0
0 评论