为了判断某一天是不是股票的交易日,以此区分自然日与交易日,我们通过抓取深交所的交易日历获取相关数据
获取交易日思路
首先,打开深交所的交易日历页面:http://www.szse.cn/aboutus/calendar/index.html
我们可以看到2022-04-04
和2022-04-05
那个地方是灰色的,因此大概率能够区分是否为交易日的接口在,果然一番操作下来(打开F12的Network看借口),我们发现了交易日历的接口:
对于接口:http://www.szse.cn/api/report/exchange/onepersistenthour/monthList?month=2022-04
这样,我们就有了如下方案:
- 构造URL:
http://www.szse.cn/api/report/exchange/onepersistenthour/monthList?month={日期}
- 写一个小爬虫,解析这个接口数据
- 如果
jybz
为0,表示非交易日,如果jybz
是1,表示是交易日
完整代码
import requests
import json
import requests.packages.urllib3.util.ssl_
import time
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL' # 防止SSL限制
def save_trading_date(date_str: str, is_trading_day: bool):
"""保存结果:交易日/非交易日
:param date_str: 日期,字符串格式
:param is_trading_day: 是否为交易日,为了区分交易日保存
"""
if is_trading_day:
save_file_path = "交易日.txt"
else:
save_file_path = "非交易日.txt"
with open(save_file_path, 'a') as file:
file.write(date_str)
file.write("\n")
def get_trading_date(month_date: str):
"""通过爬虫抓取深交所的交易日历
:param month_date: 日期,例 2020-01、2022-12
"""
target_url = "http://www.szse.cn/api/report/exchange/onepersistenthour/monthList?month={}".format(month_date)
send_headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
"Connection": "keep-alive",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"}
time.sleep(2) # 限制频率
req = requests.get(target_url, headers=send_headers)
json_state = json.loads(req.text)
for dict_value in json_state['data']:
if dict_value['jybz'] == "0": # 非交易日
save_trading_date(dict_value['jyrq'], False)
elif dict_value['jybz'] == "1": # 交易日
save_trading_date(dict_value["jyrq"], True)
def main():
for _year_i in ["2020", "2021", "2022"]:
for _month_i in range(12):
get_trading_date("{}-{}".format(_year_i, _month_i + 1))
if __name__ == '__main__':
main()
然后会在本地生成两个文件:交易日.txt
与非交易日.txt
,内容就是对应的日期了:
交易日.txt:
2020-01-02
2020-01-03
2020-01-06
2020-01-07
....
非交易日.txt:
2020-01-01
2020-01-04
2020-01-05
2020-01-11
2020-01-12
2020-01-18
2020-01-19
2020-01-24
2020-01-25
2020-01-26
2020-01-27
2020-01-28
2020-01-29
....