Day 24:专案06 - 股市趋势图01 | 单月股市API、Pandas

各位早安,今天是第24天,但其实爬虫的技巧大致上已经教得差不多了,而且我猜会看我的文章的人,应该都想知道爬虫还可以做哪些应用吧,所以我想铁人赛的最後几天,就来做点有趣的专案,顺便介绍一些方便的工具给各位~

说到爬虫,股市价格几乎是最常见的应用了,虽然爬虫可以帮你省下很多时间,但抓下来的资料往往是一大堆数字,让人看得头昏眼花,这时如果将资料画成图表的话,股价的趋势就可以一目了然了。

那麽,我们就来绘制股市趋势图吧!

图片来源:https://unsplash.com/photos/fiXLQXAhCfk

台湾证券交易所API

首先,资料来源是台湾证券交易所个股日成交资讯,选择年份月份和股票代码後按查询,底下就会出现该股票当月的成交资讯了。我们发现载入时网站并没有重新刷新,所以这应该也和昨天的KKBOX一样,用AJAX技术载入资料。

打开F12>>Network并重新查询一次,果不其然被我们找到传递资料的API了,名称为STOCK_DAY?response=json...

小诀窍:
在寻找API时,只筛选Fetch/XHR,可以大幅缩减要寻找的范围。

其实这个API的参数很单纯,date表示某年月份的股市资料,stockNo则表示股票代码。

因为9月还没过完,为了资料的完整性,我就挑2021年8月作为例子,股票代码就随便挑一个 元大台湾50(0050)。

跟昨天一样抓取资料:

# 台湾证券交易所,个股日成交资讯
url = "https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20210801&stockNo=0050"

# 取得股票资料json字串
response = requests.get(url)
print(response.text)

日期至少要在当月之前,不然会回传这个讯息:

{"stat":"查询日期大於今日,请重新查询!"}

股票代码也要是真实存在的,不然会回传这个讯息:

{"stat":"很抱歉,没有符合条件的资料!"}

正确情况下,回传的资料为json格式的字串,一样使用json.loads()转成python可用的型态。且待会要用到datafield这两个资料。

# 从json字串转为python的字典格式
json_data = json.loads(response.text)
datas = json_data["data"]
fields = json_data["fields"]

Pandas

说到Pandas,你第一个会联想到什麽?

...foodpanda吗? 我看你是饿了吧XD

Pandas是Python的一个支援数据操纵和分析的套件,它的名字衍生自术语「面板数据」(panel data)。Pandas使用特别的资料结构DataFrame储存资料,并支援多种格式的汇入与汇出,高度的优化让Pandas在处理数据上非常快速,因此经常在资料探勘(Data Mining)和机器学习(Machine Learning)领域中使用。

现在我们就要将刚才抓到的股市资料存成Pandas的DataFrame,并汇出成csv档。其实要存成csv档也可以用昨天教的csv writer,但我想说改教点新的东西,让大家了解更多Python实用的套件,对大家来说也比较好。

你可能会想说:「为什麽要储存下来,每次程序都从API抓资料不就好了吗?」

会储存下来有三种考量:

  1. 台湾证券交易所可不是随便你爬,他如果发现你太频繁地呼叫API,就会将你的IP给Ban掉,短时间内你都抓不到资料了(不要不信,我真的被Ban过)
  2. 节省网路使用量
  3. 像是单月股价这种资料,基本上不太会有变动,所以使用储存的资料根本就没差。

那要怎麽将资料转成DataFrame呢?

# 存成Pandas的Dataframe
df = pd.DataFrame(datas, columns=fields)
print(df)

你没看错,就是这麽简单!

因为资料本身就是由List组成的二维阵列,而columns代表横的栏位,fields原本就排好了,所以直接当建构元的参数就好。

印出来大概是这样,会发现其实已经有点像CSV的格式了。

Pandas汇出

Pandas有个超赞的优点不得不说,只要将资料整理成DataFrame,只要使用一个函数,就能将资料汇出,而且还支援多种格式,是不是超方便的呢!!

底下示范将资料存成.csv档,excel用的.xlsx档,以及网页的.html档。另外也支援.json.sqlite档。

# 转成csv档
df.to_csv("./month_stock.csv", encoding="big5")
# 转成xlsx档
df.to_excel("./month_stock.xlsx", encoding="big5")
# 转成html档
df.to_html("./month_stock.html")

结果:

.csv

.xlsx

.html

小结

今天是股市趋势图的第一天,进度从台湾证券交易所取得单月股市资料,并将资料转成Pandas的DataFrame,最後汇出成档案! 明天没意外应该会来讲怎麽取得整年的资料,我们明天再见~


如果喜欢这系列文章麻烦帮我按Like加订阅,你的支持是我创作最大的动力~

本系列文章以及范例程序码都同步更新在GitHub上,後续会持续的更新,如果喜欢也麻烦帮我按个星星吧~

有任何问题或建议,都欢迎在底下留言区提出,还请大家多多指教。


<<:  D15 - 「类比×电压×输入」:建立控制组件

>>:  Rust-所有权(一)

Day 11:架设 Grafana (0)

做好了指标的收集,接下来还有一个很重要的步骤 --- 数据的视觉化,关於这方面的功能虽然 Prome...

[Day29] Whack A Mole Game

[Day29] Whack A Mole Game 打地鼠 需要用到的技巧与练习目标 const s...

Day 24-制作购物车之设计主画面

继昨天完成SideDrawer等,今天要来呈现HomeScreen&ProductScree...

Day2: 什麽是演算法?— Algorithms

图片来源:*https://www.dcard.tw/f/funny/p/225385728 大家...

Day 3: 人工智慧在音乐领域的应用 (各层面的应用二)

今天我们接续昨天的话题继续来聊聊AI在音乐领域上除了作曲以外的各方面应用。 谱面辨识/采谱系统 这边...