一、项目背景与目标
中国研究生招生信息网(研招网)作为教育部直属的权威平台,承载着全国高校招生计划、专业目录、考试科目等核心数据。本文将以爬取"2025年北京市计算机专业招生信息"为例,演示如何通过Python构建高效爬虫系统,实现结构化数据采集与可视化分析。

二、技术选型与架构设计
1. 核心工具链
- Requests + BeautifulSoup:基础HTTP请求与HTML解析
- Scrapy框架:分布式爬取与Pipeline数据管道
- Selenium:动态渲染页面处理
- Pandas + Matplotlib:数据清洗与可视化
2. 系统架构图
请求层 → 解析层 → 存储层 → 分析层
│ │ │ │
Requests BS4/XPath CSV/MySQL Pandas
│ │ │ │
Selenium Scrapy MongoDB Matplotlib
三、关键实现步骤
1. 目标URL分析与参数构造
研招网专业目录查询接口采用动态参数机制:
base_url = "https://yz.chsi.com.cn/zsml/queryAction.do"
params = {
"ssdm": "11", # 北京代码
"dwmc": "", # 学校名称
"mldm": "zyxw", # 学术学位
"yjxkdm": "0812", # 计算机科学与技术代码
"xxfs": 1, # 全日制
"pageno": 1 # 页码
}
2. 动态参数获取方案
通过抓包发现专业代码存储在:
https://yz.chsi.com.cn/zsml/pages/getZy.jsp
返回JSON结构示例:
[
{"dm":"081200","mc":"计算机科学与技术"},
{"dm":"083500","mc":"软件工程"}
]
3. 核心爬取代码实现
方案一:Requests+BeautifulSoup
import requests
from bs4 import BeautifulSoup
import pandas as pd
def fetch_major_data(params):
headers = {
"User-Agent": "Mozilla/5.0"
}
url = f"{base_url}?{'&'.join([f'{k}={v}' for k,v in params.items()])}"
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'lxml')
# 定位数据表格
table = soup.find('table', {'class': 'ch-table'})
rows = table.find_all('tr')[1:] # 跳过表头
data = []
for row in rows:
cols = row.find_all('td')
data.append({
"学校": cols[0].get_text(strip=True),
"院系所": cols[1].get_text(strip=True),
"专业": cols[2].get_text(strip=True),
"研究方向": cols[3].get_text(strip=True),
"招生人数": cols[4].get_text(strip=True),
"考试科目": cols[5].get_text(strip=True)
})
return pd.DataFrame(data)
except Exception as e:
print(f"爬取失败: {e}")
return pd.DataFrame()
方案二:Scrapy框架实现
import scrapy
from ..items import ResearchItem
class MajorSpider(scrapy.Spider):
name = "major_spider"
allowed_domains = ["yz.chsi.com.cn"]
def start_requests(self):
base_params = {
"ssdm": "11",
"mldm": "zyxw",
"yjxkdm": "0812"
}
for page in range(1, 10): # 假设最多10页
params = base_params.copy()
params["pageno"] = page
url = f"{base_url}?{'&'.join([f'{k}={v}' for k,v in params.items()])}"
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
for tr in response.css('table.ch-table tr')[1:]:
item = ResearchItem()
item['school'] = tr.css('td:nth-child(1)::text').get()
item['department'] = tr.css('td:nth-child(2)::text').get()
item['major'] = tr.css('td:nth-child(3)::text').get()
item['direction'] = tr.css('td:nth-child(4)::text').get()
item['count'] = tr.css('td:nth-child(5)::text').get()
item['subjects'] = tr.css('td:nth-child(6)::text').get()
yield item
这里插播一条粉丝福利,如果你正在学习Python或者有计划学习Python,想要突破自我,对未来十分迷茫的,可以点击这里获取最新的Python学习资料和学习路线规划(免费分享,记得关注)
4. 反爬机制应对策略
1.IP代理池:使用scrapy-proxies中间件
2.User-Agent池:
from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random}
3.请求间隔控制:
import time
import random
time.sleep(random.uniform(1, 3)) # 1-3秒随机延迟
四、数据存储方案
1. CSV格式存储
df.to_csv('beijing_cs_majors_2025.csv', index=False, encoding='utf-8-sig')
2. MySQL数据库存储
import pymysql
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:password@localhost:3306/research?charset=utf8mb4')
df.to_sql('majors', engine, if_exists='append', index=False)
五、数据分析与可视化
1. 招生规模统计
import matplotlib.pyplot as plt
# 按学校分组统计招生人数
school_counts = df.groupby('学校')['招生人数'].sum().sort_values(ascending=False)
plt.figure(figsize=(12, 6))
school_counts.head(10).plot(kind='bar', color='skyblue')
plt.title('北京市计算机专业招生规模TOP10')
plt.ylabel('招生人数')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
2. 考试科目词云
from wordcloud import WordCloud
import jieba
# 合并所有考试科目
subjects = ' '.join(df['考试科目'].dropna().tolist())
# 中文分词
seg_list = jieba.cut(subjects)
wc_text = " ".join(seg_list)
# 生成词云
wc = WordCloud(
font_path='simhei.ttf',
background_color='white',
width=800,
height=600
).generate(wc_text)
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
六、项目优化方向
- 增量爬取:记录最后爬取时间戳,只获取更新数据
- 分布式架构:使用Scrapy-Redis实现多节点协作
- 智能解析:结合NLP技术处理非结构化数据
- API化输出:构建Flask/Django接口提供数据服务
通过本文的完整实现方案,读者可快速搭建研招网数据采集系统,并延伸至招生政策分析、考情预测等高级应用场景。建议在实施过程中重点关注目标网站的反爬策略更新,保持技术方案的可持续性。
需要完整代码以及Python全套学习资料的宝子,可以扫描下方csdn官方微信二维码获娶↓ ↓ ↓ ↓ ↓ ↓

被折叠的 条评论
为什么被折叠?



