关于程序员:用-Python-爬取股票实时数据

29次阅读

共计 2900 个字符,预计需要花费 8 分钟才能阅读完成。

明天咱们一起来学习一个 Python 爬虫实战案例,咱们的指标网站就是西方财富网,废话不多说,开搞

网站剖析

西方财富网地址如下

http://quote.eastmoney.com/ce…

咱们通过点击该网站的下一页发现,网页内容有变动,然而网站的 URL 却不变,也就是说这里应用了 Ajax 技术,动静从服务器拉取数据,这种形式的益处是能够在不从新加载整幅网页的状况下更新局部数据,加重网络负荷,放慢页面加载速度。

咱们通过 F12 来查看网络申请状况,能够很容易的发现,网页上的数据都是通过如下地址申请的

http://38.push2.eastmoney.com…|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1658838404848

接下来咱们多申请几次,来察看该地址的变动状况,发现其中的 pn 参数代表这页数,于是,咱们能够通过批改 &pn= 前面的数字来拜访不同页面对应的数据

import requests

json_url = "http://48.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112402508937289440778_1658838703304&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1658838703305"

res = requests.get(json_url)

数据处理

接下来咱们察看返回的数据,能够看出数据并不是规范的 json 数据

于是咱们先进行 json 化

result = res.text.split("jQuery112402508937289440778_1658838703304")[1].split("(")[1].split(");")[0]
result_json = json.loads(result)
result_json

Output:

这样数据就参差多了,所有的股票数据都在 data.diff 上面,咱们只须要编写解析函数即可

返回各参数对应含意:

  • f2:最新价
  • f3:涨跌幅
  • f4:涨跌额
  • f5:成交量(手)
  • f6:成交额
  • f7:振幅
  • f8:换手率
  • f9:市盈率
  • f10:量比
  • f12:股票代码
  • f14:股票名称
  • f15:最高
  • f16:最低
  • f17:今开
  • f18:昨收
  • f22:市净率

先筹备一个存储函数

def save_data(data, date):
    if not os.path.exists(r'stock_data_%s.csv' % date):
        with open("stock_data_%s.csv" % date, "a+", encoding='utf-8') as f:
            f.write("股票代码, 股票名称, 最新价, 涨跌幅, 涨跌额, 成交量(手), 成交额, 振幅, 换手率, 市盈率, 量比, 最高, 最低, 今开, 昨收, 市净率 \n")
            for i in data:
                Code = i["f12"]
                Name = i["f14"]
                Close = i['f2']
                ChangePercent = i["f3"]
                Change = i['f4']
                Volume = i['f5']
                Amount = i['f6']
                Amplitude = i['f7']
                TurnoverRate = i['f8']
                PERation = i['f9']
                VolumeRate = i['f10']
                Hign = i['f15']
                Low = i['f16']
                Open = i['f17']
                PreviousClose = i['f18']
                PB = i['f22']
                row = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
                    Code,Name,Close,ChangePercent,Change,Volume,Amount,Amplitude,
                    TurnoverRate,PERation,VolumeRate,Hign,Low,Open,PreviousClose,PB)
                f.write(row)
                f.write('\n')
    else:
    ...

而后再把后面解决好的 json 数据传入

stock_data = result_json['data']['diff']
save_data(stock_data, '2022-07-28')

这样咱们就失去了第一页的股票数据

最初咱们只须要循环抓取所有网页即可

for i in range(1, 5):
    print("抓取网页 %s" % str(i))
    url = "http://48.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112402508937289440778_1658838703304&pn=%s&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1658838703305" % str(i)
    res = requests.get(json_url)
    result = res.text.split("jQuery112402508937289440778_1658838703304")[1].split("(")[1].split(");")[0]
    result_json = json.loads(result)
    stock_data = result_json['data']['diff']
    save_data(stock_data, '2022-07-28')

这样咱们就实现了整个股票数据的抓取,喜爱就点个赞吧~

前面咱们还会基于以上代码,实现一个股票数据抓取 GUI 程序,再之后再一起实现一个股票数据 Web 展现程序,最终实现一个股票量化平台,敬请期待哦!

本文由 mdnice 多平台公布

正文完
 0