☰
【实战】Python爬取全国考研信息与可视化(附源码)
2026/10/8 7:06:02 网站建设 项目流程

一、项目背景与目标

随着考研热度逐年攀升,考生对全国各高校的招生信息、专业目录、分数线等数据的需求日益增长。手动浏览各大高校官网不仅耗时费力,而且信息分散、难以对比。本项目旨在通过 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;q=0.9", } def get_page(url): """发送 GET 请求并返回 HTML 文本""" try: response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() response.encoding = "utf-8" return response.text except requests.RequestException as e: print(f"请求失败: {e}") return None

3.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(strip=True), "major_code": cells[1].get_text(strip=True), "major_name": cells[2].get_text(strip=True), "enroll_count": cells[3].get_text(strip=True), "exam_subjects": cells[4].get_text(strip=True), } 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, filename="kaoyan_data.csv"): """数据清洗并保存为 CSV""" df = pd.DataFrame(data_list) 去除重复记录 df.drop_duplicates(inplace=True) 去除首尾空白字符 for col in df.columns: if df[col].dtype == object: df[col] = df[col].str.strip() 填充缺失值 df.fillna("未知", inplace=True) 保存到本地 df.to_csv(filename, index=False, encoding="utf-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, maptype="china") .set_global_opts( title_opts=opts.TitleOpts(title="全国考研院校地区分布"), visualmap_opts=opts.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_n=15): """绘制专业热度排行榜""" 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_opts=opts.TitleOpts(title="考研专业热度 TOP15"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30)), ) .set_series_opts(label_opts=opts.LabelOpts(position="right")) ) 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, marker="o", linestyle="-", color="#1f77b4") plt.title(f"{school_name} 历年复试分数线趋势") plt.xlabel("年份") plt.ylabel("分数线") plt.grid(True, alpha=0.3) plt.tight_layout() plt.savefig("score_trend.png", dpi=150) 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 爬虫与数据可视化的核心技能,并将其灵活应用到实际学习与工作中。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询