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

优采云 发布时间: 2022-08-06 01:48

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

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

  网站分析

  东方财富网地址如下

  #hs_a_board

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

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

  |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&_=48

  

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

  import requests<br /><br />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"<br /><br />res = requests.get(json_url)<br />

  数据处理

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

  于是我们先进行 json 化

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

  Output:

  

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

  返回各参数对应含义:

  先准备一个存储函数

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

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

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

  这样我们就得到了第一页的*敏*感*词*

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

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

  这样我们就完成了整个*敏*感*词*的抓取,喜欢就点个赞吧~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线