东方财富股吧话题爬虫实现:从接口请求到Excel数据落地
在金融数据采集场景中,股吧作为投资者交流的重要平台,其话题数据具备较高的分析价值。本文将详细拆解一个东方财富股吧话题爬虫的实现过程,从HTTP请求构造、JSON数据解析到Excel文件保存,完整讲解爬虫开发的核心逻辑与实操要点。
一、技术栈选型
本爬虫项目核心依赖两个Python库:
requests:用于发送HTTP POST请求,与目标接口建立通信并获取数据;pandas:用于将结构化数据快速转换并保存为Excel文件,简化数据持久化操作。
核心思路:通过模拟浏览器请求,调用东方财富股吧的公开接口获取JSON格式数据,解析出核心字段后,借助pandas完成数据的Excel格式化输出。
二、核心功能模块拆解
1. HTTP请求封装(fetch_data函数)
爬虫的第一步是与目标接口建立有效通信,该函数封装了POST请求的核心逻辑,同时处理了异常情况:
python
def fetch_data(url, headers, data):
"""
向指定的 URL 发送 POST 请求,获取返回的 JSON 数据。
"""
try:
# 发送 POST 请求并获取响应
response = requests.post(url, data=data, headers=headers)
response.raise_for_status() # 若响应状态非200,抛出异常
return response.json() # 返回响应的 JSON 数据
except requests.exceptions.RequestException as e:
# 捕获请求过程中所有异常,打印错误信息
print(f"请求失败: {e}")
return None # 请求失败,返回 None
关键要点:
response.raise_for_status():主动校验响应状态码,避免接收非200的异常响应;- 捕获
RequestException异常:涵盖网络超时、连接失败、状态码异常等所有请求相关错误,保证程序鲁棒性; - 直接返回JSON格式数据:接口返回的原生数据为JSON,无需额外解析字符串。
2. 数据解析(extract_data函数)
接口返回的JSON数据包含大量冗余字段,该函数筛选出核心业务字段,并封装为结构化列表:
python
def extract_data(json_data):
"""
从返回的 JSON 数据中提取需要的字段并整理为一个列表。
"""
data_list = [] # 用于存储提取后的数据
# 遍历数据中的 "re" 字段(核心数据数组)
for item in json_data.get("re", []):
# 为每个数据项构造字典,映射字段名与值
entry = {
"昵称": item.get("nickname", ""), # 提取昵称,默认值为空字符串
"话题描述": item.get("desc", ""), # 提取话题内容,默认值为空字符串
"发帖数": item.get("postNumber", 0), # 提取发帖数,默认值为0
"点击数": item.get("clickNumber", 0), # 提取点击数,默认值为0
"链接": f"https://gubatopic.eastmoney.com/topic/{item.get('htid', '')}" # 拼接话题链接
}
data_list.append(entry) # 将数据项添加到列表
return data_list # 返回整理后的数据列表
关键要点:
json_data.get("re", []):使用get方法避免键不存在导致的KeyError,默认值为空列表;- 字段默认值设置:针对可能为空的字段(如
nickname、htid),设置空字符串/0作为默认值,避免后续处理报错; - 链接拼接:通过
htid(话题唯一ID)拼接完整话题链接,便于后续溯源。
3. 数据持久化(save_to_excel函数)
将解析后的结构化数据保存为Excel文件,方便非技术人员查看和分析:
python
def save_to_excel(data_list, filename):
"""
将提取的数据保存为 Excel 文件。
"""
if data_list: # 检查数据列表非空
# 使用 pandas 将数据列表转换为 DataFrame(表格结构)
df = pd.DataFrame(data_list)
# 将 DataFrame 保存为 Excel 文件,不保留索引列
df.to_excel(filename, index=False)
print(f"数据已保存为 Excel 文件: {filename}") # 提示用户保存成功
else:
print("无数据可保存") # 数据列表为空,提示用户无数据
关键要点:
- 先校验数据非空:避免生成空的Excel文件;
index=False:去掉pandas默认的索引列,保证Excel文件整洁;- 极简的表格转换:pandas自动将字典列表转换为行列结构,无需手动处理单元格映射。
4. 主函数(main):流程串联
主函数整合所有模块,定义请求参数并执行完整爬取流程:
python
def main():
"""
程序主逻辑:整合获取数据、提取数据和保存数据。
"""
# 目标接口 URL 地址
url = "https://gubatopic.eastmoney.com/interface/GetData.aspx?path=newtopic/api/Topic/HistoryTopicRead"
# 请求头:模拟浏览器身份,包含Referer、User-Agent、Cookie
headers = {
"Referer": "https://gubatopic.eastmoney.com/", # 来源页,防止接口校验
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Cookie": "qgqp_b_id=a61693959fdc4bb71ecbee53face393a; st_si=54722690200006; isRecommendArr=; st_asi=delete; st_pvi=09423090003821; st_sp=2024-10-15%2015%3A40%3A13; st_inirUrl=https%3A%2F%2Fdata.eastmoney.com%2Fyjfp%2F; st_sn=27; st_psi=20241210131757530-119114100242-4473679530"
}
# POST 请求参数
data = {
"param": "ps=50&p=1&type=0", # 每页50条数据,第1页,类型为0
"path": "newtopic/api/Topic/HomePageListRead", # 接口路径参数
"env": 2 # 环境标识
}
# 获取数据
json_data = fetch_data(url, headers, data)
# 若成功获取数据
if json_data:
# 提取核心数据
data_list = extract_data(json_data)
# 保存到 Excel 文件
save_to_excel(data_list, "data.xlsx")
else:
print("获取数据失败,无法保存到文件") # 数据获取失败提示
关键参数说明:
headers:Referer用于通过接口的来源页校验,User-Agent模拟浏览器,Cookie维持会话状态(需替换为自身有效Cookie);data参数:ps=50表示每页获取50条数据,p=1表示获取第1页,可调整参数实现多页爬取。
三、运行与扩展建议
1. 基础运行步骤
- 安装依赖:
pip install requests pandas openpyxl(openpyxl为pandas保存Excel的依赖); - 替换
Cookie:将headers中的Cookie替换为自己浏览器访问东方财富股吧后的有效Cookie; - 执行脚本:直接运行py文件,成功后生成
data.xlsx文件。
2. 功能扩展方向
- 多页数据爬取:循环修改
data["param"]中的p参数(如p=2、p=3),实现多页数据采集; - 增量爬取:记录已爬取的
htid,避免重复采集同一话题; - 定时执行:结合
schedule库,实现每日定时爬取股吧最新话题; - 异常重试:为
fetch_data函数添加重试机制(如tenacity库),应对临时网络波动; - 数据清洗:对
话题描述字段做去重、过滤敏感词、去除特殊符号等处理。
四、注意事项
- 合规性:该爬虫仅用于技术学习,爬取数据需遵守东方财富网的用户协议,禁止商用和高频请求;
- Cookie有效期:Cookie存在过期时间,若请求失败,需重新从浏览器复制最新Cookie;
- 接口稳定性:第三方接口的参数、返回格式可能随时变更,需定期校验并调整解析逻辑;
- 反爬应对:避免短时间内高频请求,可添加请求间隔(
time.sleep),降低被封禁IP的风险。
五、总结
本案例展示了一个轻量化爬虫的完整开发流程:从HTTP请求的封装与异常处理,到JSON数据的结构化解析,再到Excel文件的持久化保存,核心是"模拟请求-解析数据-落地数据"的经典爬虫范式。通过该案例,不仅能掌握requests和pandas的基础用法,更能理解爬虫开发中"鲁棒性"(异常处理、默认值设置)和"易用性"(Excel输出)的设计思路。
对于金融数据采集场景,此类轻量化爬虫能够快速满足小规模数据需求,而在此基础上的扩展(多页、定时、增量),则可适配更复杂的业务场景。