You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:45:06