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

如何用Python Requests和BeautifulSoup抓取JS动态加载的院校课程信息?

嘿,这个场景我太熟了!不用Selenium完全能搞定——那些“+X More Courses”的内容,本质是网页通过异步API请求加载的,咱们直接抓这个API接口就行,比模拟浏览器点击高效多了。下面给你一步步拆解:

步骤1:先爬取初始页面的院校基础信息和关键标识

首先用Requests+BeautifulSoup拿到页面上的院校列表,核心是提取每个院校的唯一ID(比如shiksha里的collegeId)——后续加载课程的API肯定需要这个ID作为参数。代码示例:

import requests
from bs4 import BeautifulSoup

url = "https://www.shiksha.com/b-tech/colleges/b-tech-colleges-mumbai-all"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

# 发起初始页面请求
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

colleges = []
# 遍历每个院校卡片(需根据页面实际DOM结构调整class)
for college_card in soup.find_all("div", class_="collegeCard"):
    college_name = college_card.find("h3").text.strip()
    # 提取院校ID:通常在链接的data属性或URL参数里,这里假设是data-id
    college_id = college_card.find("a")["data-id"]
    # 拿到初始显示的第一个课程
    initial_course = college_card.find("div", class_="course-name").text.strip()
    
    colleges.append({
        "name": college_name,
        "id": college_id,
        "courses": [initial_course]
    })
步骤2:找到加载更多课程的API接口

打开浏览器开发者工具(按F12),切换到Network标签,然后点击页面上的“+X More Courses+”按钮,观察新出现的请求。你会看到一个XHR/fetch类型的请求,地址可能类似https://www.shiksha.com/api/college/courses/list这类。

重点看这个请求的:

  • 请求参数:比如collegeId(就是我们刚才提取的ID)、courseLevel(比如UG对应本科)、limit(每页返回的课程数)
  • 请求头:复制User-Agent、Referer这些字段,模拟请求时带上,避免被反爬拦截
步骤3:用Requests模拟API请求,获取完整课程列表

拿到API地址和参数后,循环每个院校ID发起请求,解析返回的JSON数据提取课程:

import json

# 替换成你实际抓到的API地址
api_url = "https://www.shiksha.com/api/college/courses/list"

for college in colleges:
    params = {
        "collegeId": college["id"],
        "courseLevel": "UG",
        "limit": 100  # 设个足够大的数值,一次性拉完所有课程
    }
    
    # 发起API请求
    api_response = requests.get(api_url, headers=headers, params=params)
    course_data = json.loads(api_response.text)
    
    # 解析课程列表(需根据API返回的JSON结构调整字段)
    more_courses = [course["courseName"] for course in course_data["data"]["courses"]]
    # 合并初始课程和更多课程,去重
    college["courses"] = list(set(college["courses"] + more_courses))
    
    print(f"院校:{college['name']},所有课程:{college['courses']}")
几个关键注意事项
  • 反爬适配:如果遇到403/404,检查请求头是否完整,必要时添加Cookie(可以从浏览器开发者工具里复制),或者用requests.Session()保持会话
  • 接口变化:网站可能会更新API地址或参数,定期用开发者工具验证请求结构,及时调整代码
  • 分页处理:如果API是分页返回的,要循环请求直到没有更多数据(比如判断返回的课程数量为0,或者看hasMore这类标识字段)

这样下来,纯Requests+BeautifulSoup就能拿到所有课程信息,比Selenium轻便太多啦!

内容的提问来源于stack exchange,提问作者Abhay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:05:35