数据爬虫(四):东方财富数据当日成交数据

import pandas as pd
import requests
import time

def stock_zh_a_spot_em(page_num: int) -> pd.DataFrame:
    """
    获取东方财富网-沪深京 A 股-实时行情数据
    :param page_num: 请求的页码
    :return: 实时行情数据
    :rtype: pandas.DataFrame
    """
    # 定义请求的URL
    url = "http://82.push2.eastmoney.com/api/qt/clist/get"

    # 定义请求的参数
    params = {
        "pn": str(page_num),  # 页码
        "pz": "50000",  # 每页数量
        "po": "1",  # 排序方式
        "np": "1",  # 是否需要分页
        "ut": "bd1d9ddb04089700cf9c27f6f7426281",  # 用户 token
        "fltt": "2",  # 复权类型
        "invt": "2",  # 投资类型
        "fid": "f3",  # 排序字段
        "fs": "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048",  # 股票市场筛选条件
        "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
        "_": str(int(time.time() * 1000)),  # 时间戳
    }

    # 发送GET请求
    r = requests.get(url, params=params)

    # 解析返回的JSON数据
    data_json = r.json()

    # 如果数据为空,返回空的DataFrame
    if not data_json.get("data") or not data_json["data"].get("diff"):
        return pd.DataFrame()

    # 将数据转换为DataFrame
    temp_df = pd.DataFrame(data_json["data"]["diff"])

    # 设置DataFrame的列名
    temp_df.columns = [
        "id", "最新价", "涨跌幅", "涨跌额", "成交量", "成交额", "振幅", "换手率", "市盈率-动态",
        "量比", "5分钟涨跌", "代码", "id_", "名称", "最高", "最低", "今开", "昨收", "总市值",
        "流通市值", "涨速", "市净率", "60日涨跌幅", "年初至今涨跌幅", "-", "-", "-", "-", "-", "-", "-"
    ]

    # 选择并重新排列需要的列
    temp_df = temp_df[
        [
            "代码", "名称", "最新价", "涨跌幅", "涨跌额", "成交量", "成交额", "振幅",
            "最高", "最低", "今开", "昨收", "量比", "换手率", "市盈率-动态", "市净率", "总市值",
            "流通市值", "涨速", "5分钟涨跌", "60日涨跌幅", "年初至今涨跌幅"
        ]
    ]

    # 将各列数据转换为数值类型
    temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
    temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
    temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
    temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
    temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
    temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
    temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
    temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
    temp_df["今开"] = pd.to_numeric(temp_df["今开"], errors="coerce")
    temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce")
    temp_df["量比"] = pd.to_numeric(temp_df["量比"], errors="coerce")
    temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
    temp_df["市盈率-动态"] = pd.to_numeric(temp_df["市盈率-动态"], errors="coerce")
    temp_df["市净率"] = pd.to_numeric(temp_df["市净率"], errors="coerce")
    temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
    temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce")
    temp_df["涨速"] = pd.to_numeric(temp_df["涨速"], errors="coerce")
    temp_df["5分钟涨跌"] = pd.to_numeric(temp_df["5分钟涨跌"], errors="coerce")
    temp_df["60日涨跌幅"] = pd.to_numeric(temp_df["60日涨跌幅"], errors="coerce")
    temp_df["年初至今涨跌幅"] = pd.to_numeric(temp_df["年初至今涨跌幅"], errors="coerce")

    return temp_df


def main():
    # 初始化一个空的DataFrame用于存储所有数据
    all_data = pd.DataFrame()

    # 循环爬取1到57页的数据
    for page in range(1, 58):
        print(f"正在爬取第 {page} 页数据...")
        df = stock_zh_a_spot_em(page)
        if df.empty:
            print(f"第 {page} 页数据为空,停止爬取。")
            break
        all_data = pd.concat([all_data, df], ignore_index=True)
        time.sleep(0.5)  # 添加延时,避免请求过于频繁

    # 生成时间戳标签
    label = str(int(time.time()))

    # 将数据保存到Excel文件
    all_data.to_excel(f'股票数据-{label}.xlsx', index=False)
    print("数据爬取完成,已保存到Excel文件。")


if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值