【爬取新浪股票实时数据--tushare】

# -*- coding: utf-8 -*-
"""
Created on Sat Apr  7 03:15:00 2018

@author: Administrator
"""

import pandas as pd
import numpy as np 
import tushare as ts 
import time
import threading

class sina_real_data:
    def __init__(self):
        print('sina_real_data 类')
        self.sina={}
    # 获取股票实时数据
    def sina_(self,code):
        df=pd.DataFrame()
        N=len(code)
        max_num=891
        M=int(N/max_num)+1
        for i in range(M):
            t=time.time()
            N1=i*max_num
            N2=(i+1)*max_num-1
            if i==M:
                dataT=ts.get_realtime_quotes(code[N1:])
            else:    
                dataT=ts.get_realtime_quotes(code[N1:N2+1])
            if len(df)==0:
                df=dataT
            else:
                df=pd.concat([df,dataT],ignore_index=True)
            t=round(time.time()-t,3)
            #print('---i='+str(i)+';N1='+str(N1)+';N2='+str(N2)+';耗时:'+str(t))
        return df
    def sina_hand(self,code):
        pass
        df=self.sina_(code)
        df['price']=df['price'].apply(float)
        df['volume']=df['volume'].apply(float)
        
        date=df['date'].values[-1]+' '+df['time'].values[-1]
        
        # 为了测试
        t=time.localtime(time.time())
        date=time.strftime("%Y-%m-%d %H:%M:%S",t)
            
            
        date=pd.to_datetime(date)
        price=list(np.round( df['price'].values,2))
        volume=np.round( df['volume'].values,0)
        if 'volume_np' not in self.sina:
            self.sina['volume_np']=volume
            if t.tm_hour==9 and t.tm_min==30:
                pass 
            else:
                volume=np.zeros(len(volume)) 
        else:
            volumeL=volume
            volume=volume-self.sina['volume_np']
            self.sina['volume_np']=volumeL
        volume=list(volume)
        
        price=price+[date]
        volume=volume+[date]
        
        if 'price' not in self.sina:
            self.sina['price']=[price]
            self.sina['volume']=[volume]
        else:
            self.sina['price'].append(price)
            self.sina['volume'].append(volume)
            
            
        if len(self.sina['price'])>200:
            self.sina['price']=self.sina['price'][-150:]
            self.sina['volume']=self.sina['volume'][-150:]
        self.sina_1_min()
    def sina_1_min(self):
        if len(self.sina['price'])<60:
            return 
        price=self.sina['price']
        dfA=pd.DataFrame(price)
        dfA.set_index(dfA.columns[-1], inplace=True)
        volume=self.sina['volume']
        dfB=pd.DataFrame(volume)
        dfB.set_index(dfB.columns[-1], inplace=True)
        
        periodS = '1min'
        kdata={}
        kdata['open'] = dfA.resample(periodS).first()
        kdata['high'] = dfA.resample(periodS).max()
        kdata['low'] = dfA.resample(periodS).min()
        kdata['close'] = dfA.resample(periodS).last()
        kdata['volume'] = dfB.resample(periodS).sum()
        self.sina['kdata']=kdata
    # 定时器启动收集数据
    def sina_run(self,code):
        while True:
            time.sleep(3)
            t=time.localtime(time.time())
            ts=time.strftime("%Y-%m-%d %H:%M:%S",t)
            # print(ts+'  定时器运行')
            try:
                self.sina_hand(code)
                        
                pass
            except:
                pass
    
    def sina_run_start(self,code):
        # 启动策略线程 
        tt = threading.Thread(target=self.sina_run, args=(code,))
        tt.start()
        
if __name__=='__main__':
    self=sina_real_data()
    
    
    stocklist=pd.read_hdf('Z:/data/stock_data_py/list/stocklist.h5')
    stocklist['codenum']=stocklist['code'].apply(lambda x:x[7:9].lower()+x[:6])
    code=list(stocklist['codenum'].values)
    tickdata = self.sina_(code)
    
    
    
    self.sina_run_start(code)
    
    t=time.time()
    df=self.sina_(code)
    t=round(time.time()-t,3)
    print('耗时:'+str(t))
    df['bid']=df['bid'].apply(float)
    df['ask']=df['ask'].apply(float)
    a=df[ ( df['bid']<0.001) & ( df['ask']<0.001) ]
    
    data=self.sina
    

 

转载于:https://www.cnblogs.com/fyandy/p/9613437.html

爬取新浪财经-股票-行情-北交所”的全部5页共200支股票数据的实验原理大致如下: 1. 首先需要确定要爬取的页面 URL,通过网络请求将 URL 发送给服务器。 2. 分析页面结构和元素,确定需要爬取数据,如股票名称、代码、当前价格、涨跌幅等。 3. 使用 Python 的 requests 库发送网络请求,获取 HTML 数据。 4. 使用 BeautifulSoup 库解析 HTML 数据,获取所需的数据。 5. 将数据存储到列表中,遍历所有页面,将数据存储到一个列表中。 6. 使用 pandas 库将数据列表转换成 DataFrame 对象。 7. 使用 DataFrame 的 to_csv() 方法将数据写入 csv 文件。 具体实现过程可以参考以下步骤: 1. 导入必要的库 ``` import requests from bs4 import BeautifulSoup import pandas as pd ``` 2. 确定要爬取的页面 URL,遍历所有页面,获取数据 ``` data = [] # 存储数据的列表 for i in range(1, 6): # 遍历所有页面 url = 'https://finance.sina.com.cn/stock/sjjhq/bjshydt/{}.shtml'.format(i) r = requests.get(url) r.encoding = 'utf-8' soup = BeautifulSoup(r.text, 'html.parser') table = soup.find('table', class_='tbl-data') trs = table.find_all('tr')[1:] # 去掉表头行 for tr in trs: tds = tr.find_all('td') name = tds[0].text # 股票名称 code = tds[1].text # 股票代码 price = tds[2].text # 当前价格 change = tds[3].text # 涨跌幅 data.append([name, code, price, change]) ``` 3. 将数据存储到 DataFrame 对象中 ``` columns = ['股票名称', '股票代码', '当前价格', '涨跌幅'] df = pd.DataFrame(data=data, columns=columns) ``` 4. 将数据写入 csv 文件 ``` df.to_csv('data.csv', index=False, encoding='utf-8-sig') ``` 这样就完成了对“新浪财经-股票-行情-北交所”的全部5页共200支股票数据爬取,并将爬取的200条股票数据写入 csv 文件的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值