利用Backtrader进行期权回测之六:用Scrapy爬取期权合约

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

在期权回测中我用到了三种数据:期权日数据、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)

		# 循环处理每一条合约
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值