股票行情爬取

对沪深A股的股票行情进行爬取,并保存在mongodb数据库中,最终通过查询数据库中的相关数据计算周行情数据。

1、爬取沪深A股目前的所有股票代码

具体行情以网易为主,但是需要按股票代码为以主来爬取相应行情,从东方财富爬取沪深A市场的所有股票代码。

在东方财富网站上进入行情中心,找到“http://quote.eastmoney.com/center/gridlist.html#hs_a_board”页面,可以看到沪深A股的所有股票的最新数据。在该网页下,进入开发者模式,通过“network”工具,可以发现在实际处理中,请求的url为

http://62.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112407939967130801426_1628420280168&pn=' + str(page + 1) +'&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23&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&_=1628420280169

一共有230页,通过循环,获取所有的股票代码。具体实现代码如下所示:

def get_stock_list():
    
    code_id_list = []
    for page in range(230):
        Url = 'http://62.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112407939967130801426_1628420280168&pn=' + str(page + 1) +'&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23&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&_=1628420280169'
        html = requests.get(Url)
        html = html.text
    
        stock = re.findall(re.compile('\((.*)\)'),html)
        stock = stock[0]
        stock = eval(stock)
        data_stock = stock['data']
        total_stock = data_stock['total']
        diff_stock = data_stock['diff']
    
        for signal_stock in diff_stock:
            code_id = signal_stock['f12']

            code_id_list.append(code_id)

    return code_id_list

2、依据股票代码爬取相应的股票行情

通过网易中心,来获取股票的最新行情,当然也可以通过东方财富等网站,本文是因为前期做的部分工作,所以才会采用网易的行情数据。

注意,沪深两地的连接略有区别,可以通过股票代码的第一位数字来区别。具体代码如下。

for code_id in code_id_list:
    print('正在获取%s股票数据...' % code_id)
    if (code_id[0] == '6' or code_id[0] == '9'):
        url = 'http://quotes.money.163.com/service/chddata.html?code=0' + code_id + \
              '&start=19900101&end=now&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP'
        print(url)
    else:
        url ='http://quotes.money.163.com/service/chddata.html?code=1' + code_id + \
              '&start=19900101&end=now&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP'
        print(url)
    urllib.request.urlretrieve(url,'./' + code_id + '.csv')
csvx_list = glob.glob('/virt/20210728/spider/stock/*.csv')

上述代码中爬取的是从“start”到”end“期间的每天行情数据。

由于数据量比较大。所以将数据先保存到对应的csv文件中,然后再进行合并成一个文件。如下是合并的流程。

for i in csvx_list:
    fr = codecs.open(i, 'r').read()
    print(fr)
    with open(r'./merge.csv', 'a') as f:  # 合并csv文件
        f.write(fr)
print('写入完毕!')

4、存储到mongodb数据库中

经过上述处理后,行情数据保存在merge文件中,下一步考虑将数据保存到mongo数据库中。

本文主要讲述mongodb数据库的基本使用,所以就不在此对安装与启动作过多的赘述。

4.1、首先数据库的创建

client = pymongo.MongoClient('localhost',27017) #创建连接

db_stock = client['stock_info'] #创建名为 "stock_info" 的数据库

sheet_stock = db_stock['stock'] #在"weather"数据库中建表"stock"

上述代码实现了在本地创建一个名为’stock_info”的数据库,并且在该数据库中创建了一个名为“stock”的数据表。

4.2、数据库的存储

上面已经将数据存入了merge.csv文件中,所以现在要读取该文件,并且将该内容插入到“stock”数据标中。

marge_file_path = "./merge.csv"

stock_title = ['日期', '股票代码', '名称', '收盘价', '最高价', '最低价', '开盘价', '前收盘', '涨跌额', '涨跌幅', '换手率', '成交量', '成交金额', '总市值', '流通市值']
with open(marge_file_path, 'r') as f:
    reader = csv.reader(f)
    print(type(reader))

    for row in reader:
        #print(type(row))
        code_info = row[1]
        if "'" in code_info:
            code_id = code_info[1:]
            stock_info_row = row 
            stock_info_row[1] = code_id 
            stock_info = dict(zip(stock_title,stock_info_row))
            print(stock_info)
            sheet_stock.insert_one(stock_info)
        else:
            stock_title = row

在上述代码中,实现了从“merge.csv‘文件中读取没行数据,并且结合每行数据的实际含义,成对存入数据表中的过程。

最后通过相关工具,数据在数据库中的展示如下。

 本文只是简单地讲述以下股票行情以及mongodb的写入操作,至于将针对这些行情数据进行更新以及周线等计算操作将在后续文章中描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reset2021

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值