从零开始搞定新浪财经美股实时数据抓取
我一开始只是想看看新浪财经那边美股的数据到底是怎么跑出来的。你知道,平时看行情软件,数据都是跳动的,但我总觉得里头肯定有些门道。我就琢磨着自己能不能把新浪财经美股的实时行情数据给抓下来,自己看看。
第一步,搞清楚数据来源
我直接打开新浪财经的美股页面,随便找了只股票,比如苹果。然后我就打开了浏览器的开发者工具,直接切换到网络(Network)那个选项卡。盯着数据流动看了一会儿,发现行情页面的数据更新速度挺快。
我仔细筛选了一下,发现每隔几秒钟就会有一个请求发出,而且这个请求的回应里头,就是我要的实时数据。那个链接地址很长,但仔细一看,它就是通过一个特定的接口去请求数据的。接口里带着股票代码,还有一些时间戳啥的参数。
- 找到关键的API接口地址。
- 分析接口返回的数据格式,通常是JSON或者JS代码包裹的数据。
- 确定哪些参数是必需的,比如股票代码。
第二步,尝试请求数据
知道了接口地址,下一步就是用代码去模拟浏览器发送请求。我习惯用Python,简单快速。我最开始直接用requests库去请求那个URL。
import requests
url = '那个长长的接口地址'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
response = *(url, headers=headers)
print(*)
第一次跑出来,发现返回的不是标准的JSON,而是一段JavaScript代码,代码里头定义了一个变量,变量的值才是真正的数据。这是新浪财经惯用的套路,用JS代码包裹数据,防止被直接抓取。
第三步,处理返回的JS代码
既然返回的是JS代码,那就得想办法把它里面的数据提取出来。我试了两个方法:
- 正则匹配: 简单粗暴,找到数据开始和结束的标志,用正则表达式把中间的内容抠出来。
- 字符串处理: 因为数据的格式比较固定,可以直接用字符串的切片和替换操作,把外层的JS变量定义去掉,只留下纯净的数据部分。
我选择了字符串处理,因为它更稳定。数据通常是这样的格式:var hq_str_gb_aapl="92.12,123.45,...",我只要把var hq_str_gb_aapl="和末尾的去掉,剩下的就是逗号分隔的字符串数据了。
提取出来后,发现数据是一串用逗号分隔的值。我得对照新浪财经的说明,搞清楚每个位置代表什么,比如第一个是现价,第二个是涨跌额,等等。这个对照过程花了一点时间,主要就是打开网页,人工对比。
实现实时数据监控与优化
数据能抓下来了,下一步就是实现“实时”。很简单,加个循环,设置个时间间隔,让程序每隔几秒钟就跑一次,重新请求数据。
我把整个过程封装成了一个函数,输入股票代码,输出处理好的字典格式数据,方便后续使用。
遇到的几个小问题:
- 请求频率: 一开始我设了1秒更新一次,跑了一会儿发现,服务器响应变慢了。为了友好一点,我把间隔调整到了3秒。毕竟新浪财经的实时数据更新频率也没快到1秒一次。
- 多只股票: 发现新浪财经的接口支持一次性查询多只股票,只需要在请求参数里用逗号把多个股票代码分隔开就行。这大大提高了效率。
我用这个小工具在本地运行,把抓到的实时数据打印出来,或者存到一个简单的文件中。看着数据不断跳动,心里还是挺有成就感的。虽然只是新浪财经开放的数据,但自己亲手实践一遍,对了解数据传输和网页抓取机制,真的帮助很大。现在想看美股最新行情,我都不用打开浏览器了,直接看我自己的脚本输出。



还没有评论,来说两句吧...