• 实战干货!用 Python 爬取股票实时数据!


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

    网站分析

    东方财富网地址如下

    http://quote.eastmoney.com/center/gridlist.html#hs_a_board

    我们通过点击该网站的下一页发现,网页内容有变化,但是网站的 URL 却不变,也就是说这里使用了 Ajax 技术,动态从服务器拉取数据,这种方式的好处是可以在不重新加载整幅网页的情况下更新部分数据,减轻网络负荷,加快页面加载速度。

    我们通过 F12 来查看网络请求情况,可以很容易的发现,网页上的数据都是通过如下地址请求的

    http://38.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112409036039385296142_1658838397275&pn=3&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&_=1658838404848

    接下来我们多请求几次,来观察该地址的变化情况,发现其中的pn参数代表这页数,于是,我们可以通过修改&pn=后面的数字来访问不同页面对应的数据

    1. import requests
    2. 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"
    3. res = requests.get(json_url)

    数据处理

    接下来我们观察返回的数据,可以看出数据并不是标准的 json 数据

    于是我们先进行 json 化

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

    Output:

    这样数据就整齐多了,所有的股票数据都在data.diff下面,我们只需要编写解析函数即可

    返回各参数对应含义:

    • f2:最新价

    • f3:涨跌幅

    • f4:涨跌额

    • f5:成交量(手)

    • f6:成交额

    • f7:振幅

    • f8:换手率

    • f9:市盈率

    • f10:量比

    • f12:股票代码

    • f14:股票名称

    • f15:最高

    • f16:最低

    • f17:今开

    • f18:昨收

    • f22:市净率

    先准备一个存储函数

    1. def save_data(data, date):
    2.     if not os.path.exists(r'stock_data_%s.csv' % date):
    3.         with open("stock_data_%s.csv" % date, "a+", encoding='utf-8'as f:
    4.             f.write("股票代码,股票名称,最新价,涨跌幅,涨跌额,成交量(手),成交额,振幅,换手率,市盈率,量比,最高,最低,今开,昨收,市净率\n")
    5.             for i in data:
    6.                 Code = i["f12"]
    7.                 Name = i["f14"]
    8.                 Close = i['f2']
    9.                 ChangePercent = i["f3"]
    10.                 Change = i['f4']
    11.                 Volume = i['f5']
    12.                 Amount = i['f6']
    13.                 Amplitude = i['f7']
    14.                 TurnoverRate = i['f8']
    15.                 PERation = i['f9']
    16.                 VolumeRate = i['f10']
    17.                 Hign = i['f15']
    18.                 Low = i['f16']
    19.                 Open = i['f17']
    20.                 PreviousClose = i['f18']
    21.                 PB = i['f22']
    22.                 row = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
    23.                     Code,Name,Close,ChangePercent,Change,Volume,Amount,Amplitude,
    24.                     TurnoverRate,PERation,VolumeRate,Hign,Low,Open,PreviousClose,PB)
    25.                 f.write(row)
    26.                 f.write('\n')
    27.     else:
    28.     ...

    然后再把前面处理好的 json 数据传入

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

    这样我们就得到了第一页的股票数据

    最后我们只需要循环抓取所有网页即可

    1. for i in range(15):
    2.     print("抓取网页%s" % str(i))
    3.     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)
    4.     res = requests.get(json_url)
    5.     result = res.text.split("jQuery112402508937289440778_1658838703304")[1].split("(")[1].split(");")[0]
    6.     result_json = json.loads(result)
    7.     stock_data = result_json['data']['diff']
    8.     save_data(stock_data, '2022-07-28')

    这样我们就完成了整个股票数据的抓取,喜欢就点个吧~

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

    【python学习】
    学Python的伙伴,欢迎加入新的交流【君羊】:1020465983
    一起探讨编程知识,成为大神,群里还有软件安装包,实战案例、学习资料 

  • 相关阅读:
    苹果上架Guideline 4.3 - Design
    关于STM32Fx部分引脚不可以正常输出高低电平的解决办法(不可以正常使用)
    【实践篇】教你玩转JWT认证---从一个优惠券聊起
    专题二:滑动窗口【优选算法】
    word文档怎么删除多余的空白页?
    JS的数组与字符串方法脑图总结
    【2023华为杯B题】DFT类矩阵的整数分解逼近(思路及代码下载)
    【英语:基础进阶_语法进阶提升】F1.英文时态进阶
    redis cluster集群搭建
    心理学考研难度 分析
  • 原文地址:https://blog.csdn.net/weixin_56659172/article/details/126174080