在期权回测中我用到了三种数据:期权日数据、ETF日数据和期权合约数据。其中前两种数据的获取方法已经在本系列的第1篇文章中做了说明,这里补充一下怎么获取期权合约数据。
期权合约数据是从上交所和深交所下载的。虽然深交所的合约可以手工下载excel文件再转化为CSV之后通过python程序读取。然而,如果需要长期持续地获取数据,最好还是通过爬虫自动爬取。
本文演示怎么通过scrapy爬虫获取上交所/深交所的期权合约信息。假定读者对scrapy有一定的了解,知道scrapy的基础用法。对scrapy不了解的读者可以先看scrapy官方教程中文版。
1. 上交所期权合约
上交所的数据在上交所当日合约可以查到。
1.1 上交所网页的反爬措施
分析上交所的URL,可以看到有两个地方需要特殊处理:
- 原网页通过一个回调函数处理返回数据,所以请求里要给一个回调函数名称。HTTP请求的参数形式如下:jsonCallBack=jsonpCallbacknnnnn。最后的“nnnnn”是一个随机数。可以通过python的randint()函数生成。
- 请求里有一个时间戳参数,形式如下:_=1596089949708。等号后面的数字是当前时间的毫秒数,可以通过time.time()*1000来获得。
1.2 创建爬虫
打开一个命令行窗口,进入要创建爬虫项目的目录,然后输入下面的命令:
scrapy startproject optdata
其中optdata是要创建的项目名称。scrapy创建的内容如下:
optdata/
scrapy.cfg
optdata/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
1.3 实现爬虫
进入刚才创建的“optdata\optdata\spiders”目录,用自己喜欢的编辑器新建一个名为“OptCodeSpider.py”的文件。我习惯用pycharm。
import scrapy
import json
import time
import re
import pandas as pd
from datetime import date
from random import randint, random
# 爬取上交所期权合约
class SSEOptCodeSpider(scrapy.Spider):
name = "sseoptcode" # 上交所期权合约爬虫名称
# 定义爬虫使用的header信息
headers = {
'Referer': 'http://www.sse.com.cn/assortment/options/disclo/preinfo/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
}
# 爬取下来的数据保存在这个文件里
data_file = 'D:\Srcs\python\stockenv\data\options\opts_sse.csv'
# 爬取的期权合约信息
opts = []
# 获取起始URL的内容
def start_requests(self):
# 构造上交所期权数据的URL
url = self.get_opt_code_url()
# 获取页面内容。上交所当日合约可以全部放在一个页面里,不需要处理翻页问题。
yield scrapy.Request(url=url, headers=headers, callback=self.parse)
# 解析页面内容
def parse(self, response):
# 首先把返回数据转换成json数据
json_str = response.text[18:-1]
data = json.loads(json_str)
# 循环处理每一条合约

本文介绍如何使用Scrapy爬虫自动获取上海证券交易所和深圳证券交易所的期权合约详细信息,包括处理反爬机制、构造请求和解析数据。
最低0.47元/天 解锁文章
969

被折叠的 条评论
为什么被折叠?



