深入解析中国大学MOOC数据采集从API逆向到Python实战每次打开中国大学MOOC平台看到海量优质课程资源时你是否好奇这些数据背后隐藏着怎样的结构作为国内领先的在线教育平台其数据架构和API设计对开发者而言是个绝佳的学习案例。今天我们就用Python的Requests库带你从零开始探索这个知识宝库的数据获取之道。1. 准备工作与环境搭建在开始爬取数据前我们需要做好充分的技术准备。不同于简单的网页抓取API数据采集更注重对网络请求本质的理解。首先确保你的开发环境已经安装以下基础工具包pip install requests pandas numpy推荐使用Jupyter Notebook进行交互式开发方便实时查看数据返回结果。对于请求调试Postman或Insomnia这类API测试工具能极大提升效率。关键工具选择考量Requests库比urllib更人性化的HTTP客户端Pandas专业的数据处理与分析工具Jupyter交互式开发环境适合数据探索提示建议先注册一个中国大学MOOC的测试账号避免频繁请求触发安全机制2. API接口逆向分析实战现代Web应用大多采用前后端分离架构数据通过API接口传输。打开Chrome开发者工具F12切换到Network面板重点关注XHR/fetch请求。2.1 核心请求参数解析观察典型API请求我们会发现几个关键组成部分参数类型示例作用HeadersUser-Agent标识客户端类型CookiesNTESSTUDYSI维持会话状态PayloadpageIndex分页参数URL参数csrfKey安全令牌一个完整的请求示例headers { User-Agent: Mozilla/5.0, Referer: https://www.icourse163.org/, Content-Type: application/json } params { pageIndex: 1, pageSize: 20, orderBy: 3 }2.2 动态令牌处理技巧平台使用csrfKey作为重要安全验证这个值通常能在以下几个位置找到登录后的Set-Cookie响应头页面HTML中的meta标签初始API返回数据获取后需要保持会话一致性session requests.Session() session.headers.update(headers) response session.post(api_url, jsonparams)3. 数据采集全流程实现有了API基础认知后我们来构建完整的采集流程。这个过程中异常处理和日志记录同样重要。3.1 分类数据获取平台课程采用多级分类体系首先获取顶层分类def get_categories(): url https://www.icourse163.org/web/j/category/list.rpc resp session.post(url) data resp.json() categories [] for item in data[result]: categories.append({ id: item[id], name: item[name], parentId: item.get(parentId, 0) }) return pd.DataFrame(categories)3.2 课程详情采集获取分类后可按分类遍历课程列表def get_courses_by_category(category_id, page1): params { categoryId: category_id, pageIndex: page, pageSize: 50 } try: resp session.post(COURSE_API, jsonparams) data resp.json() courses [] for item in data[result][list]: course item[course] courses.append({ courseId: course[id], title: course[name], school: course[school][name], enrollCount: course[enrollCount] }) return courses except Exception as e: print(f获取课程失败: {e}) return []3.3 评论数据抓取课程评论往往是最有价值的数据需要注意分页逻辑def get_course_comments(course_id, max_pages5): comments [] for page in range(1, max_pages1): params { courseId: course_id, pageIndex: page, pageSize: 20 } resp session.post(COMMENT_API, jsonparams) data resp.json() for comment in data[result][list]: comments.append({ content: comment[content], rating: comment[mark], createTime: comment[gmtCreate] }) if page data[result][totalPage]: break return pd.DataFrame(comments)4. 高级技巧与优化方案基础采集实现后我们需要考虑工程化问题确保程序稳定高效运行。4.1 反爬应对策略平台常见的防护措施包括请求频率限制User-Agent检测行为模式分析应对方案# 随机延迟控制 import random import time def random_delay(): time.sleep(random.uniform(0.5, 2.5)) # 代理IP池示例 proxies { http: http://proxy.example.com:8080, https: https://proxy.example.com:8080 } response requests.get(url, proxiesproxies)4.2 数据存储优化根据数据量级选择存储方案数据规模推荐方案优势1GBSQLite轻量易用1-10GBMySQL成熟稳定10GBMongoDB灵活扩展使用Pandas直接导出示例# 导出Excel df.to_excel(courses.xlsx, indexFalse) # 导出到数据库 from sqlalchemy import create_engine engine create_engine(sqlite:///mooc.db) df.to_sql(courses, engine, if_existsappend)4.3 性能优化技巧大规模采集时需要考虑# 使用aiohttp实现异步请求 import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.json() async def main(): async with aiohttp.ClientSession() as session: tasks [fetch(session, url) for url in urls] return await asyncio.gather(*tasks)5. 数据分析实战案例采集到的数据如何产生价值下面演示几个分析方向。5.1 热门课程分析# 按报名人数排序 top_courses df.sort_values(enrollCount, ascendingFalse).head(10) # 院校课程数量统计 school_stats df.groupby(school)[courseId].count().sort_values(ascendingFalse)5.2 评论情感分析使用SnowNLP进行简单情感分析from snownlp import SnowNLP def analyze_sentiment(text): s SnowNLP(text) return s.sentiments df[sentiment] df[content].apply(analyze_sentiment)5.3 数据可视化Matplotlib基础图表示例import matplotlib.pyplot as plt plt.figure(figsize(10,6)) df[school].value_counts().head(10).plot(kindbarh) plt.title(Top 10 Universities by Course Count) plt.tight_layout() plt.show()在实际项目中我发现最耗时的环节往往是异常处理和数据清洗。特别是当平台更新接口时原有的采集逻辑可能需要全面调整。保持代码的模块化和良好的日志记录习惯能大幅降低维护成本。
手把手教你用Requests库搞定中国大学MOOC的API数据抓取(附完整代码)
发布时间:2026/6/3 10:10:42
深入解析中国大学MOOC数据采集从API逆向到Python实战每次打开中国大学MOOC平台看到海量优质课程资源时你是否好奇这些数据背后隐藏着怎样的结构作为国内领先的在线教育平台其数据架构和API设计对开发者而言是个绝佳的学习案例。今天我们就用Python的Requests库带你从零开始探索这个知识宝库的数据获取之道。1. 准备工作与环境搭建在开始爬取数据前我们需要做好充分的技术准备。不同于简单的网页抓取API数据采集更注重对网络请求本质的理解。首先确保你的开发环境已经安装以下基础工具包pip install requests pandas numpy推荐使用Jupyter Notebook进行交互式开发方便实时查看数据返回结果。对于请求调试Postman或Insomnia这类API测试工具能极大提升效率。关键工具选择考量Requests库比urllib更人性化的HTTP客户端Pandas专业的数据处理与分析工具Jupyter交互式开发环境适合数据探索提示建议先注册一个中国大学MOOC的测试账号避免频繁请求触发安全机制2. API接口逆向分析实战现代Web应用大多采用前后端分离架构数据通过API接口传输。打开Chrome开发者工具F12切换到Network面板重点关注XHR/fetch请求。2.1 核心请求参数解析观察典型API请求我们会发现几个关键组成部分参数类型示例作用HeadersUser-Agent标识客户端类型CookiesNTESSTUDYSI维持会话状态PayloadpageIndex分页参数URL参数csrfKey安全令牌一个完整的请求示例headers { User-Agent: Mozilla/5.0, Referer: https://www.icourse163.org/, Content-Type: application/json } params { pageIndex: 1, pageSize: 20, orderBy: 3 }2.2 动态令牌处理技巧平台使用csrfKey作为重要安全验证这个值通常能在以下几个位置找到登录后的Set-Cookie响应头页面HTML中的meta标签初始API返回数据获取后需要保持会话一致性session requests.Session() session.headers.update(headers) response session.post(api_url, jsonparams)3. 数据采集全流程实现有了API基础认知后我们来构建完整的采集流程。这个过程中异常处理和日志记录同样重要。3.1 分类数据获取平台课程采用多级分类体系首先获取顶层分类def get_categories(): url https://www.icourse163.org/web/j/category/list.rpc resp session.post(url) data resp.json() categories [] for item in data[result]: categories.append({ id: item[id], name: item[name], parentId: item.get(parentId, 0) }) return pd.DataFrame(categories)3.2 课程详情采集获取分类后可按分类遍历课程列表def get_courses_by_category(category_id, page1): params { categoryId: category_id, pageIndex: page, pageSize: 50 } try: resp session.post(COURSE_API, jsonparams) data resp.json() courses [] for item in data[result][list]: course item[course] courses.append({ courseId: course[id], title: course[name], school: course[school][name], enrollCount: course[enrollCount] }) return courses except Exception as e: print(f获取课程失败: {e}) return []3.3 评论数据抓取课程评论往往是最有价值的数据需要注意分页逻辑def get_course_comments(course_id, max_pages5): comments [] for page in range(1, max_pages1): params { courseId: course_id, pageIndex: page, pageSize: 20 } resp session.post(COMMENT_API, jsonparams) data resp.json() for comment in data[result][list]: comments.append({ content: comment[content], rating: comment[mark], createTime: comment[gmtCreate] }) if page data[result][totalPage]: break return pd.DataFrame(comments)4. 高级技巧与优化方案基础采集实现后我们需要考虑工程化问题确保程序稳定高效运行。4.1 反爬应对策略平台常见的防护措施包括请求频率限制User-Agent检测行为模式分析应对方案# 随机延迟控制 import random import time def random_delay(): time.sleep(random.uniform(0.5, 2.5)) # 代理IP池示例 proxies { http: http://proxy.example.com:8080, https: https://proxy.example.com:8080 } response requests.get(url, proxiesproxies)4.2 数据存储优化根据数据量级选择存储方案数据规模推荐方案优势1GBSQLite轻量易用1-10GBMySQL成熟稳定10GBMongoDB灵活扩展使用Pandas直接导出示例# 导出Excel df.to_excel(courses.xlsx, indexFalse) # 导出到数据库 from sqlalchemy import create_engine engine create_engine(sqlite:///mooc.db) df.to_sql(courses, engine, if_existsappend)4.3 性能优化技巧大规模采集时需要考虑# 使用aiohttp实现异步请求 import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.json() async def main(): async with aiohttp.ClientSession() as session: tasks [fetch(session, url) for url in urls] return await asyncio.gather(*tasks)5. 数据分析实战案例采集到的数据如何产生价值下面演示几个分析方向。5.1 热门课程分析# 按报名人数排序 top_courses df.sort_values(enrollCount, ascendingFalse).head(10) # 院校课程数量统计 school_stats df.groupby(school)[courseId].count().sort_values(ascendingFalse)5.2 评论情感分析使用SnowNLP进行简单情感分析from snownlp import SnowNLP def analyze_sentiment(text): s SnowNLP(text) return s.sentiments df[sentiment] df[content].apply(analyze_sentiment)5.3 数据可视化Matplotlib基础图表示例import matplotlib.pyplot as plt plt.figure(figsize(10,6)) df[school].value_counts().head(10).plot(kindbarh) plt.title(Top 10 Universities by Course Count) plt.tight_layout() plt.show()在实际项目中我发现最耗时的环节往往是异常处理和数据清洗。特别是当平台更新接口时原有的采集逻辑可能需要全面调整。保持代码的模块化和良好的日志记录习惯能大幅降低维护成本。