如何用Python+BeautifulSoup爬取Coursera前10页课程列表?
解决Coursera多页课程爬取问题
Coursera的课程列表是动态加载的,直接修改URL的page参数没用——因为前端是通过异步请求接口获取后续页面数据,而非服务器端渲染不同页面。以下是具体实现方案:
1. 定位动态加载的API端点
打开浏览器开发者工具(F12),切换到「网络」面板:
- 访问
https://www.coursera.org/courses - 滚动页面到底部,触发下一页加载
- 在请求列表里找类型为
XHR的请求,通常URL类似https://www.coursera.org/api/search/v2/courses,这就是获取课程数据的核心接口
2. 模拟API请求
用requests库发送GET请求到该API,需带上必要参数和请求头:
- 核心参数:
offset(每页起始偏移量)和limit(每页课程数量,一般为20),其他参数(如fields、sortField)直接从抓包的请求里复制即可 - 请求头:至少带上
User-Agent模拟浏览器,避免被拦截
3. 代码示例
import requests import time # 模拟浏览器请求头 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', 'Accept': 'application/json' } # 核心API地址(需根据抓包结果调整) base_api_url = "https://www.coursera.org/api/search/v2/courses" total_pages = 10 per_page = 20 # 每页课程数,和抓包的limit参数保持一致 for page_num in range(total_pages): # 计算当前页的偏移量 offset = page_num * per_page params = { 'limit': per_page, 'offset': offset, 'fields': 'id,slug,name,partnerIds,description', # 按需选择要抓取的字段 'sortField': 'BEST_MATCH', 'sortOrder': 'ASC', 'q': '' # 空值表示全课程搜索,有筛选条件可修改此处 } # 发送请求并处理响应 response = requests.get(base_api_url, headers=headers, params=params) response.raise_for_status() # 抛出请求错误 course_data = response.json() # 解析并输出课程信息 for item in course_data['elements']: course = item['element'] print(f"课程名称: {course['name']}") print(f"课程链接: https://www.coursera.org/learn/{course['slug']}") print(f"提供机构ID: {course['partnerIds']}") print("-" * 50) # 避免请求过于频繁,添加延迟 time.sleep(2)
注意事项
- 抓包时要保证参数和浏览器请求完全一致,否则可能返回错误数据
- 若遇到403/401错误,可尝试添加浏览器的
Cookie到请求头(从开发者工具的请求里复制) - 不要过度频繁请求,避免被Coursera封禁IP
- API返回的JSON结构可能会更新,需根据实际返回结果调整解析逻辑
内容的提问来源于stack exchange,提问作者user634831
相关产品推荐
相关产品推荐

