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()
数据爬虫(四):东方财富数据当日成交数据
于 2025-03-11 22:44:04 首次发布