东方财富股吧话题爬虫实现:从接口请求到Excel数据落地

东方财富股吧话题爬虫实现:从接口请求到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,默认值为空列表;
  • 字段默认值设置:针对可能为空的字段(如nicknamehtid),设置空字符串/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("获取数据失败,无法保存到文件")  # 数据获取失败提示

关键参数说明

  • headersReferer用于通过接口的来源页校验,User-Agent模拟浏览器,Cookie维持会话状态(需替换为自身有效Cookie);
  • data参数:ps=50表示每页获取50条数据,p=1表示获取第1页,可调整参数实现多页爬取。

三、运行与扩展建议

1. 基础运行步骤

  1. 安装依赖:pip install requests pandas openpyxlopenpyxl为pandas保存Excel的依赖);
  2. 替换Cookie:将headers中的Cookie替换为自己浏览器访问东方财富股吧后的有效Cookie;
  3. 执行脚本:直接运行py文件,成功后生成data.xlsx文件。

2. 功能扩展方向

  • 多页数据爬取:循环修改data["param"]中的p参数(如p=2p=3),实现多页数据采集;
  • 增量爬取:记录已爬取的htid,避免重复采集同一话题;
  • 定时执行:结合schedule库,实现每日定时爬取股吧最新话题;
  • 异常重试:为fetch_data函数添加重试机制(如tenacity库),应对临时网络波动;
  • 数据清洗:对话题描述字段做去重、过滤敏感词、去除特殊符号等处理。

四、注意事项

  1. 合规性:该爬虫仅用于技术学习,爬取数据需遵守东方财富网的用户协议,禁止商用和高频请求;
  2. Cookie有效期:Cookie存在过期时间,若请求失败,需重新从浏览器复制最新Cookie;
  3. 接口稳定性:第三方接口的参数、返回格式可能随时变更,需定期校验并调整解析逻辑;
  4. 反爬应对:避免短时间内高频请求,可添加请求间隔(time.sleep),降低被封禁IP的风险。

五、总结

本案例展示了一个轻量化爬虫的完整开发流程:从HTTP请求的封装与异常处理,到JSON数据的结构化解析,再到Excel文件的持久化保存,核心是"模拟请求-解析数据-落地数据"的经典爬虫范式。通过该案例,不仅能掌握requests和pandas的基础用法,更能理解爬虫开发中"鲁棒性"(异常处理、默认值设置)和"易用性"(Excel输出)的设计思路。

对于金融数据采集场景,此类轻量化爬虫能够快速满足小规模数据需求,而在此基础上的扩展(多页、定时、增量),则可适配更复杂的业务场景。

相关推荐
进击的雷神2 小时前
攻克动态列表页结构:基于ID与URL双字段协同提取的精准爬虫设计
爬虫·spiderflow
勤劳的进取家4 小时前
Excel 公式技术手册
数据库·excel
城数派4 小时前
我国省市县三级的餐饮服务设施数量(57类餐饮服务/Excel/Shp格式)2025年
arcgis·信息可视化·数据分析·excel
weixin_404679314 小时前
vscode 的csv,excel查看工具
excel
好菇娘の当自强4 小时前
Excel下载模板空白问题排查:测试环境装fontconfig即修复深度剖析
excel
梦因you而美4 小时前
Python自动化复制Excel sheet表(openpyxl+win32com双方案,完美保留格式)
python·自动化·excel·win32com·openpyxl
勤劳的进取家4 小时前
Excel 公式使用手册(精简)
算法·excel
开开心心就好19 小时前
免费自媒体多功能工具箱,图片音视频处理
人工智能·pdf·ocr·excel·音视频·语音识别·媒体
halfpast31 天前
excel查看ni tdm格式文件
excel·ni·tdm文件