ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【实战】Python爬取全国考研信息与可视化(附源码)

【实战】Python爬取全国考研信息与可视化(附源码) 一、项目背景与目标随着考研热度逐年攀升考生对全国各高校的招生信息、专业目录、分数线等数据的需求日益增长。手动浏览各大高校官网不仅耗时费力而且信息分散、难以对比。本项目旨在通过 Python 爬虫技术自动采集全国考研相关数据并通过数据可视化手段帮助考生快速掌握院校招生动态做出更科学的报考决策。本项目将实现以下核心目标数据采集爬取全国各高校考研招生简章、专业目录、历年分数线等公开信息。数据清洗对采集到的原始数据进行去重、格式化、缺失值处理。数据存储将清洗后的数据存入本地数据库或 CSV 文件便于后续分析。数据可视化通过图表展示院校分布、专业热度、分数线趋势等关键信息。二、技术选型与环境准备本项目采用 Python 作为主要开发语言结合以下核心库实现爬虫与可视化功能功能模块推荐库用途说明网络请求requests发送 HTTP 请求获取网页内容页面解析BeautifulSoup4 / lxml解析 HTML 结构提取目标数据动态渲染Selenium处理 JavaScript 动态加载的页面数据存储pandas / sqlite3数据清洗、结构化存储数据可视化matplotlib / pyecharts生成静态或交互式图表在开始编写代码之前请确保本地环境已安装 Python 3.8 及以上版本并执行以下命令安装所需依赖pip install requests beautifulsoup4 lxml selenium pandas matplotlib pyecharts三、爬虫实现与源码解析3.1 目标网站分析与请求头设置以中国研究生招生信息网研招网为例该网站提供了全国各高校的招生专业目录查询功能。在编写爬虫前需要先分析网页的请求方式、参数结构以及数据加载形式。对于静态页面直接使用 requests 即可对于动态加载的数据则需要借助 Selenium 模拟浏览器操作。import requests from bs4 import BeautifulSoup 设置请求头模拟浏览器访问 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Accept-Language: zh-CN,zh;q0.9, } def get_page(url): 发送 GET 请求并返回 HTML 文本 try: response requests.get(url, headersheaders, timeout10) response.raise_for_status() response.encoding utf-8 return response.text except requests.RequestException as e: print(f请求失败: {e}) return None3.2 数据解析与字段提取获取到网页 HTML 后使用 BeautifulSoup 定位目标数据所在的标签结构提取院校名称、专业代码、专业名称、招生人数、考试科目等关键字段。以下代码演示了如何解析招生专业目录页面def parse_school_data(html): 解析院校招生信息 soup BeautifulSoup(html, lxml) data_list [] # 定位专业信息表格 table soup.find(table, class_zsml-table) if not table: return data_list rows table.find_all(tr) for row in rows[1:]: # 跳过表头 cells row.find_all(td) if len(cells) lt; 5: continue item { school: cells[0].get_text(stripTrue), major_code: cells[1].get_text(stripTrue), major_name: cells[2].get_text(stripTrue), enroll_count: cells[3].get_text(stripTrue), exam_subjects: cells[4].get_text(stripTrue), } data_list.append(item) return data_list/code/pre 3.3 多页爬取与异常处理 考研专业目录通常包含多页数据需要实现翻页逻辑。同时为了保障爬虫的稳定性必须加入请求间隔、重试机制和异常捕获。以下代码实现了完整的多页爬取流程 import time import random def crawl_all_pages(base_url, total_pages): 循环爬取所有页面数据 all_data [] for page in range(1, total_pages 1): url f{base_url}?page{page} html get_page(url) if html: page_data parse_school_data(html) all_data.extend(page_data) print(f第 {page} 页爬取完成获取 {len(page_data)} 条数据) 随机休眠避免请求过于频繁 time.sleep(random.uniform(1, 3)) return all_data 3.4 数据清洗与存储 爬取到的原始数据往往包含空格、换行符等噪声需要统一清洗。使用 pandas 可以高效完成数据去重、类型转换和缺失值处理最后将结果保存为 CSV 文件或写入 SQLite 数据库 import pandas as pd def clean_and_save(data_list, filenamekaoyan_data.csv): 数据清洗并保存为 CSV df pd.DataFrame(data_list) 去除重复记录 df.drop_duplicates(inplaceTrue) 去除首尾空白字符 for col in df.columns: if df[col].dtype object: df[col] df[col].str.strip() 填充缺失值 df.fillna(未知, inplaceTrue) 保存到本地 df.to_csv(filename, indexFalse, encodingutf-8-sig) print(f数据已保存至 {filename}共 {len(df)} 条记录) return df 四、数据可视化与图表展示 4.1 院校地区分布图 使用 pyecharts 生成交互式地图直观展示全国各地区的考研院校数量分布。地图支持鼠标悬停查看具体数值便于考生了解目标省份的院校资源 from pyecharts import options as opts from pyecharts.charts import Map def plot_school_distribution(df): 绘制院校地区分布地图 region_count df[province].value_counts() data_pair [list(zip(region_count.index, region_count.values))] map_chart ( Map() .add(院校数量, data_pair, maptypechina) .set_global_opts( title_optsopts.TitleOpts(title全国考研院校地区分布), visualmap_optsopts.VisualMapOpts(max_max(region_count.values)), ) ) map_chart.render(school_distribution.html) print(地图已生成school_distribution.html)/code/pre 4.2 专业热度排行榜 通过统计各专业的招生院校数量生成横向柱状图帮助考生识别热门专业与冷门专业为专业选择提供数据参考 from pyecharts.charts import Bar def plot_major_ranking(df, top_n15): 绘制专业热度排行榜 major_count df[major_name].value_counts().head(top_n) bar_chart ( Bar() .add_xaxis(major_count.index.tolist()) .add_yaxis(招生院校数, major_count.values.tolist()) .set_global_opts( title_optsopts.TitleOpts(title考研专业热度 TOP15), xaxis_optsopts.AxisOpts(axislabel_optsopts.LabelOpts(rotate30)), ) .set_series_opts(label_optsopts.LabelOpts(positionright)) ) bar_chart.render(major_ranking.html) print(排行榜已生成major_ranking.html)/code/pre 4.3 历年分数线趋势图 若数据中包含历年复试分数线可以使用 matplotlib 绘制折线图展示某专业或某院校的分数变化趋势辅助考生评估报考难度 import matplotlib.pyplot as plt def plot_score_trend(years, scores, school_name): 绘制分数线趋势折线图 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False plt.figure(figsize(10, 6)) plt.plot(years, scores, markero, linestyle-, color#1f77b4) plt.title(f{school_name} 历年复试分数线趋势) plt.xlabel(年份) plt.ylabel(分数线) plt.grid(True, alpha0.3) plt.tight_layout() plt.savefig(score_trend.png, dpi150) print(趋势图已保存score_trend.png)/code/pre 五、完整源码整合与运行说明 将上述各模块整合为一个完整的 Python 脚本通过主函数统一调度。运行脚本后程序会自动完成爬取、清洗、存储和可视化全流程 def main(): 主函数执行完整爬取与可视化流程 base_url https://yz.chsi.com.cn/zsml/queryAction.do total_pages 50 # 根据实际页数调整 print(开始爬取考研数据...) raw_data crawl_all_pages(base_url, total_pages) if not raw_data: print(未获取到任何数据请检查网络或目标网站结构) return print(数据清洗与存储中...) df clean_and_save(raw_data) print(生成可视化图表...) plot_school_distribution(df) plot_major_ranking(df) print(全部任务执行完成) if name main: main() 运行上述脚本后将在当前目录生成 kaoyan_data.csv 数据文件以及多个 HTML 图表文件。考生可以直接打开图表文件查看可视化结果也可以基于 CSV 数据进一步做个性化分析。 六、注意事项与反爬策略 在实际爬取过程中需要注意以下事项以确保爬虫的合法性和稳定性 遵守 robots 协议爬取前查看目标网站的 robots.txt尊重网站的爬取规则。 控制请求频率设置合理的请求间隔避免对目标服务器造成过大压力。 使用代理 IP当请求频率较高时可配置代理池轮换 IP降低被封风险。 数据用途合规爬取的数据仅用于个人学习研究不得用于商业用途或侵犯他人权益。 动态页面处理若目标页面使用 JavaScript 动态渲染需结合 Selenium 或分析接口直接请求 JSON 数据。 七、总结与扩展方向 本文通过一个完整的实战案例演示了如何使用 Python 爬取全国考研信息并进行可视化分析。从网络请求、页面解析、数据清洗到图表生成覆盖了数据采集与分析的全链路。读者可以在此基础上进一步扩展以下方向 增加更多数据源接入各高校官网、考研论坛等更多数据来源丰富数据维度。 构建 Web 应用使用 Flask 或 Django 将爬虫与可视化结果封装为在线查询系统。 引入机器学习基于历史分数线数据构建录取概率预测模型。 定时任务调度使用 APScheduler 或 GitHub Actions 实现数据的定时自动更新。 希望本项目的源码和思路能够帮助读者掌握 Python 爬虫与数据可视化的核心技能并将其灵活应用到实际学习与工作中。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进