文章目录

一位抖音网友老朋友的结课作业。要求是使用 Python 实现一个爬虫程序,根据省份抓取高校排名。

一开始我也有点困扰,因为给我的是 https://www.shanghairanking.cn/rankings/bcur/2024 这个网址,软科这个网页是 Nuxt 框架的,筛选省份没有url或者参数,交互是个挺头疼的事情。

当然,幸好还有张嘴,问了下,原来抓取的目标网址都是自己选的。那就好办了,找个结构简单的。直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# coding:utf-8
from bs4 import BeautifulSoup

import urllib3
import requests

import time
import time
from my_fake_useragent import UserAgent

ua = UserAgent(family="chrome")
def getRandomUA():
res = ua.random()
return {"User-Agent": res}

urllib3.disable_warnings()

province_list = {
"河北": "https://www.cnur.com/region/1356.html",
"河南": "https://www.cnur.com/region/1401.html",
"山东": "https://www.cnur.com/region/1368.html",
"山西": "https://www.cnur.com/region/1357.html"
}

def getListUrl(province):
r = requests.get(province_list[province], headers=getRandomUA())
dom = BeautifulSoup(r.text, "html.parser")
table = dom.find("table")
rows = table.find('tbody').find_all('tr')
# 表头是第一行
header = [th.text for th in rows[0].find_all('td')]
# 表格的数据
data = [[td.text for td in row.find_all('td')] for row in rows[1:]]

# 存为csv文件
with open(f"{province}.csv", "w") as f:
f.write(",".join(header) + "\n")
for row in data:
f.write(",".join(row) + "\n")

def main():
for province in province_list:
getListUrl(province)
time.sleep(1)

if __name__ == '__main__':
main()

多余的注释也没写,总之就是实现了题目的要求。

当然,虽然只做了这点,其实还有其他思考的点,比如:如果要使用交互方式查询想要的省份怎么做?如果硬要解析软科的页面怎么做?

习惯思考,这也是对自己的奖励。


♦ 本文固定连接:https://www.gsgundam.com/2024/2024-05-13-z23-python-crawler-for-college-rankings/

♦ 转载请注明:GSGundam 2024年05月13日发布于 GSGUNDAM砍柴工

♦ 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

♦ 原创不易,如果页面上有适合你的广告,不妨点击一下看看,支持作者。(广告来源:Google Adsense)

♦ 本文总阅读量