各位老师帮忙看看是那里的问题获取不到了,非常感谢

从新浪财经行情中心获取每天的行情数据
from urllib.request import urlopen 
import pandas as pd
from datetime import datetime
import time
import re  
import os  # 系统库
import json  # python自带的json数据库


# =====函数:从网页上抓取数据
def get_content_from_internet(url, max_try_num=10, sleep_time=5):
   
    get_success = False  # 是否成功抓取到内容
    # 抓取内容
    for i in range(max_try_num):
        try:
            content = urlopen(url=url, timeout=10).read()  # 使用python自带的库,从网络上获取信息
            get_success = True  # 成功抓取到内容
            break
        except Exception as e:
            print('抓取数据报错,次数:', i+1, '报错内容:', e)
            time.sleep(sleep_time)

    # 判断是否成功抓取内容
    if get_success:
        return content
    else:
        raise ValueError('使用urlopen抓取网页数据不断报错,达到尝试上限,停止程序,')


# =====函数:从新浪获取指定股票的数据
def get_today_data_from_sinajs(code_list):
    

    # 构建url
    url = "http://hq.sinajs.cn/list=" + ",".join(code_list)

    # 抓取数据
    content = get_content_from_internet(url)
    content = content.decode('gbk')

    # 将数据转换成DataFrame
    content = content.strip()  # 去掉文本前后的空格、回车等
    data_line = content.split('\n')  # 每行是一个股票的数据
    data_line = [i.replace('var hq_str_', '').split(',') for i in data_line]
    df = pd.DataFrame(data_line, dtype='float')  #

    # 对DataFrame进行整理
    df[0] = df[0].str.split('="')
    df['stock_code'] = df[0].str[0].str.strip()
    df['stock_name'] = df[0].str[-1].str.strip()
    df['candle_end_time'] = df[30] + ' ' + df[31]  # 股票市场的K线,是普遍以当跟K线结束时间来命名的
    df['candle_end_time'] = pd.to_datetime(df['candle_end_time'])
    rename_dict = {1: 'open', 2: 'pre_close', 3: 'close', 4: 'high', 5: 'low', 6: 'buy1', 7: 'sell1',
                   8: 'amount', 9: 'volume', 32: 'status'}  # 自己去对比数据,会有新的返现
    # 其中amount单位是股,volume单位是元
    df.rename(columns=rename_dict, inplace=True)
    df['status'] = df['status'].str.strip('";')
    df = df[['stock_code', 'stock_name', 'candle_end_time', 'open', 'high', 'low', 'close', 'pre_close', 'amount',
             'volume', 'buy1', 'sell1', 'status']]

    return df


# =====函数:判断今天是否是交易日
def is_today_trading_day():
    

    # 获取上证指数今天的数据
    df = get_today_data_from_sinajs(code_list=['sh000001'])
    sh_date = df.iloc[0]['candle_end_time']  # 上证指数最近交易日

    # 判断今天日期和sh_date是否相同
    return datetime.now().date() == sh_date.date()


# =====函数:从新浪获取所有股票的数据
def get_all_today_stock_data_from_sina_marketcenter():
  

    # ===数据网址
    raw_url = 'https://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?page=%s' \
              '&num=80&sort=changepercent&asc=0&node=hs_a&symbol=&_s_r_a=setlen'
    page_num = 1

    # ===存储数据的DataFrame
    all_df = pd.DataFrame()

    # ===获取上证指数最近一个交易日的日期。
    df = get_today_data_from_sinajs(code_list=['sh000001'])
    sh_date = df.iloc[0]['candle_end_time'].date()  # 上证指数最近交易日

    # ===开始逐页遍历,获取股票数据
    while True:
        # 构建url
        url = raw_url % (page_num)
        print('开始抓取页数:', page_num)

        # 抓取数据
        content = get_content_from_internet(url)
        content = content.decode('gbk')

        # 判断页数是否为空
        if 'null' in content:
            print('抓取到页数的尽头,退出循环')
            break

        # 通过正则表达式,给key加上引号
        content = re.sub(r'(?<={|,)([a-zA-Z][a-zA-Z0-9]*)(?=:)', r'"\1"', content)

        # 将数据转换成dict格式
        content = json.loads(content)

        # 将数据转换成DataFrame格式
        df = pd.DataFrame(content, dtype='float')
        # 对数据进行整理
        # 重命名
        rename_dict = {'symbol': '股票代码', 'name': '股票名称', 'open': '开盘价', 'high': '最高价', 'low': '最低价',
                       'trade': '收盘价', 'settlement': '前收盘价', 'volume': '成交量', 'amount': '成交额'}
        df.rename(columns=rename_dict, inplace=True)
        # 添加交易日期
        
        df['交易日期'] = pd.to_datetime(sh_date)  

        # 取需要的列
        df = df[['股票代码', '股票名称', '交易日期', '开盘价', '最高价', '最低价', '收盘价', '前收盘价', '成交量', '成交额']]

        # 合并数据
        all_df = all_df.append(df, ignore_index=True)

        # 将页数+1
        page_num += 1
        time.sleep(1)

    # ===将当天停盘的股票删除,
    all_df = all_df[all_df['开盘价'] - 0 > 0.00001]
    all_df.reset_index(drop=True, inplace=True)

    # ===返回结果
    return all_df


# 获取今天所有的股票数据
df = get_all_today_stock_data_from_sina_marketcenter()
print(df)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

华怡蕊

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值