如何用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
相关产品推荐
相关产品推荐

