Python如何爬取上海软科ARWU排名所有分页的院校数据
软科ARWU排名多页爬取方案
核心问题说明
原有代码仅请求了第一页的固定URL,没有遍历分页参数,因此只能获取到前30条数据。
具体实现步骤
- 确认分页URL规则:软科ARWU排名的分页通过URL的
page参数控制,第N页的URL格式为https://www.shanghairanking.com/rankings/arwu/2021.html?page={N},2021年ARWU共发布1000所院校排名,总页数为34页。 - 封装单页爬取逻辑,把页面请求、解析、提取院校名称的逻辑封装为独立函数,方便循环调用
- 新增UA请求头伪装浏览器请求,避免触发站点反爬策略
- 优化原有院校名称的字符串切片逻辑,改用空白字符清理的方式提取,避免院校名称长度不同导致的截断错误
优化后完整代码
import requests from bs4 import BeautifulSoup # 配置基础参数 BASE_URL = "https://www.shanghairanking.com/rankings/arwu/2021.html" TOTAL_PAGES = 34 HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } universities = [] def get_universities_from_page(page_num): """获取指定分页的院校名称""" params = {"page": page_num} if page_num > 1 else {} response = requests.get(BASE_URL, headers=HEADERS, params=params) soup = BeautifulSoup(response.text, "html.parser") page_univs = [] for univ_tag in soup.findAll(class_='global-univ'): # 清理标签内多余空白字符,替代原有的固定切片逻辑 univ_name = univ_tag.text.strip().split()[-1] if univ_tag.text.strip() else "" if univ_name: page_univs.append(univ_name) return page_univs # 遍历所有分页 for page in range(1, TOTAL_PAGES + 1): current_univs = get_universities_from_page(page) universities.extend(current_univs) # 可选:添加请求延迟避免请求过快被限制 # import time # time.sleep(1) # 写入文件 with open('arwu.txt', 'w', encoding='utf-8') as f: for univ in universities: f.write(univ + "\n")
注意事项
- 可根据实际需要调整
TOTAL_PAGES的数值,也可以先爬取第一页获取总页数后再遍历,避免硬编码 - 建议添加适当的请求间隔,避免短时间内请求次数过多导致IP被限制
- 提取院校名称的逻辑可根据实际解析到的标签结构调整,确保提取结果准确
内容的提问来源于stack exchange,提问作者David Safro
相关产品推荐
相关产品推荐

