用python 抓取股票,看盘

本文介绍,如何用python抓取股票数据,展示在终端上.

作为程序员,如果你一整天打开同花顺,雪球,富途这些app,容易让领导看到,但有时你就想看一看,怎么办呢?

现有不少api可以使用的.

比如新浪,腾讯,雪球,网易都有.经过对比,这里用腾讯的,因为其它只有代码,没有名字,看起来不方便.

先来一段效果展示:

用python 抓取股票,看盘_第1张图片

iterm2上绿色没显示出来,所以换手率这里还是黑色的.vs code上正常.

tencent_url="http://qt.gtimg.cn/q=" + getSymbol(False)

它是get调用,把股票代码拼起来的.

stocks = {
    'sz300939':'秋田微',
    'sh603533':'掌阅科技',
    'sz301007':'德迈仕'
}

先定义一个字典对象.然后再把这些对象拼起来:

def getSymbol(isUpper) :
    stockList = ""
    for stock in stocks:
        if(isUpper) :
            stockList = stockList + "," + stock.upper()
        else :
            stockList = stockList + "," + stock.lower()

    return stockList

这样一个url拼好了.然后就是获取数据,解析了.

腾讯返回数据代码的意思,网上有人写过,我直接贴出来:

0: 未知
 1: 名字
 2: 代码
 3: 当前价格
 4: 昨收
 5: 今开
 6: 成交量(手)
 7: 外盘
 8: 内盘
 9: 买一
10: 买一量(手)
11-18: 买二 买五
19: 卖一
20: 卖一量
21-28: 卖二 卖五
29: 最近逐笔成交
30: 时间
31: 涨跌
32: 涨跌%
33: 最高
34: 最低
35: 价格/成交量(手)/成交额
36: 成交量(手)
37: 成交额(万)
38: 换手率
39: 市盈率
40: 
41: 最高
42: 最低
43: 振幅
44: 流通市值
45: 总市值
46: 市净率
47: 涨停价
48: 跌停价

因为我用的是import requests,不是urlopen,所以需要安装这个包.

在接口请求前,需要去网页上抓取这个接口的header,把里面的信息加到你的请求头上.

腾讯的新浪header可以用一个

sinaheaders = {
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0',
    'Accept-Encoding': 'gzip, deflate',
    'upgrade-insecure-requests':	'1',
    'Accept-Language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    'Content-Type': 'text/html; charset=GBK',
    'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
}

重要的好像是要传'upgrade-insecure-requests':    '1',

定义方法:

def update_session(headers):
    # 这里模拟一下请求头,头文件是从浏览器里面抓到的,否则服务会回复403错误,(其实就是服务器做的简单防爬虫检测)
    session.headers.clear()
    session.headers.update(headers)

抓取方法:

def get_page_by_url(page_url, isJson):
    strtime = time.strftime("%m-%d", time.localtime())
    #print("get_page_by_url:" + strtime + " " + page_url)

    try:
        res = session.get(page_url, timeout=(30, 120))
        if res.status_code == 200:
            if(isJson):
                info = res.json()
            else:
                info = res.text
            #print("res:"+str(info))

            return info
    except Exception as e:
        print("error:" + str(e))
    return None

方法准备好了,开始抓取了:

def tencent(url):
    update_session(sinaheaders)//先调用这个添加header
    info = get_text_by_url(url)
    if info == "":
        return
    data = info.split(';')
    for val in data:
        ss = val.split('=')
        if(len(ss)<2):
            continue
        item = ss[1]
        value = item[1:(len(item)-1)].split('~')
        #print("rest:"+str(value))
        #v_sz300939="51~秋田微~300939~53.11~51.25~51.20~16266~8653~7613~53.10~2~53.09~2~53.08~18~53.07~1~53.01~10~53.11~8~53.12~27~53.14~12~53.18~11~53.20~6~~20210917161403~1.86~3.63~53.53~51.11~53.11/16266/85410471~16266~8541~8.13~49.82~~53.53~51.11~4.72~10.62~42.49~3.86~61.50~41.00~1.67~-31~52.51~57.75~50.98~~~0.74~8541.0471~0.0000~0~ AR~GP-A-CYB~42.85~1.03~0.94~7.74~6.36~145.50~47.60~6.37~10.30~-6.76~20000000~80000000~-31.96~42.85~20000000";
        #['51', '秋田微', '300939', '53.11', '51.25', '51.20', '16266', '8653', '7613', '53.10', '2', '53.09', '2', '53.08', '18', '53.07', '1', '53.01', '10', '53.11', '8', '53.12', '27', '53.14', '12', '53.18', '11', '53.20', '6', '', '20210917161403', '1.86', '3.63', '53.53', '51.11', '53.11/16266/85410471', '16266', '8541', '8.13', '49.82', '', '53.53', '51.11', '4.72', '10.62', '42.49', '3.86', '61.50', '41.00', '1.67', '-31', '52.51', '57.75', '50.98', '', '', '0.74', '8541.0471', '0.0000', '0', ' AR', 'GP-A-CYB', '42.85', '1.03', '0.94', '7.74', '6.36', '145.50', '47.60', '6.37', '10.30', '-6.76', '20000000', '80000000', '-31.96', '42.85', '20000000']
        #开盘价,昨天收盘价,当前价,最高价,最低价,买一,卖一,成交量,金额,买一数,买一报价,买二数,买二价,买三数,买三价,买四数,买四价,买五数,买五价.卖一数,卖一价,卖二数,卖二价,卖三数,卖三价,卖四数,卖四价,卖五数,卖五价.
        #print(str(value[1]) + "   " + str(value[3]) +"    " + str(value[32]) +"%   " + str(value[37]) +"    " + str(value[4]) + "    " + str(value[7]) + "    " + str(value[8]))
        if float(value[32]) >0 :
            print('%-7s %-7s \033[1;31m %-7s \033[0m %-8s %-8s \033[1;31m %-8s \033[0m %-8s' % (str(value[1]), str(value[3]), str(value[32]) +"%", str(value[38]) +"%", str(value[4]), str(value[7]), str(value[8])))
        else :
            print('%-7s %-7s \033[1;32m %-7s \033[0m %-8s %-8s \033[1;31m %-8s \033[0m %-8s' % (str(value[1]), str(value[3]), str(value[32]) +"%", str(value[38]) +"%", str(value[4]), str(value[7]), str(value[8])))

\033[1;31m %-7s \033[0m

这段代码是将终端文字显示成红色,1;32m是绿色,可惜没出来颜色.

你可能感兴趣的:(python,股票)