import os

import requests
import time
from datetime import datetime
from requests.adapters import HTTPAdapter
import pandas as pd

pd.set_option('display.max_rows', 1000)
pd.set_option('expand_frame_repr', False)  # 当列太多时不换行
# 设置命令行输出时的列对齐功能
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)


def requestForNew(url):
    session = requests.Session()
    session.mount('http://', HTTPAdapter(max_retries=3))
    session.mount('https://', HTTPAdapter(max_retries=3))
    session.keep_alive = False
    response = session.get(url, headers={'Connection': 'close'}, timeout=30)
    if response.content:
        return response
    else:
        print("链接失败", response)


def getDate():
    url = 'http://hq.sinajs.cn/list=sh000001'
    response = requestForNew(url).text
    data_date = str(response.split(',')[-4])
    # 获取上证的指数日期
    return data_date


# 通过新浪财经获取每日更新的股票代码
def getStockCodeForEveryday():
    df = pd.DataFrame()
    for page in range(1, 100):
        # 1~100页，不用担心每天新增
        url = 'http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?page=' \
              + str(page) + '&num=80&sort=changepercent&asc=0&node=hs_a&symbol=&_s_r_a=page'
        # print(url)
        content = requestForNew(url).json()
        if not content:
            # if content =[]: 这个写法也可以
            print("股票信息，获取完毕。")
            break
        print("正在读取页面" + str(page))
        time.sleep(3)
        df = df.append(pd.DataFrame(content, dtype='float'), ignore_index=True)

    rename_dict = {'symbol': '股票代码', 'code': '交易日期', 'name': '股票名称', 'open': '开盘价',
                   'settlement': '前收盘价', 'trade': '收盘价', 'high': '最高价', 'low': '最低价',
                   'buy': '买一', 'sell': '卖一', 'volume': '成交量', 'amount': '成交额',
                   'changepercent': '涨跌幅', 'pricechange': '涨跌额',
                   'mktcap': '总市值', 'nmc': '流通市值', 'ticktime': '数据更新时间', 'per': 'per', 'pb': '市净率',
                   'turnoverratio': '换手率'}
    df.rename(columns=rename_dict, inplace=True)
    tradeDate = getDate()
    df['交易日期'] = tradeDate
    df = df[['股票代码', '股票名称', '交易日期', '开盘价', '最高价', '最低价', '收盘价', '前收盘价', '成交量', '成交额', '流通市值', '总市值']]
    # 把转化成float的code替换成交易日期
    return df


df = getStockCodeForEveryday()
print(df)

for i in df.index:
    t = df.iloc[i:i + 1, :]
    stock_code = t.iloc[0]['股票代码']

    # 构建存储文件路径
    path = './data/' \
           + stock_code + '.csv'
    # 文件存在，不是新股
    if os.path.exists(path):
        t.to_csv(path, header=None, index=False, mode='a', encoding='gbk')
    # 文件不存在，说明是新股
    else:
        # 先将头文件输出
        pd.DataFrame(columns=['数据由邢不行整理']).to_csv(path, index=False, encoding='gbk')
        t.to_csv(path, index=False, mode='a', encoding='gbk')
    print(stock_code)
