用 Python 抓取 NSE 期权链数据

Posted

技术标签:

【中文标题】用 Python 抓取 NSE 期权链数据【英文标题】:Webscraping NSE Option Chain data in Python 【发布时间】:2020-11-02 01:52:52 【问题描述】:

在这段代码中,我试图通过 Python 代码获取 NSE 选项链数据。

工具 - Spyder4 Python - 3.7

代码没有抛出任何错误,我不知道我做错了什么。 PRINT 1 将我的正确输出作为 JSON 数据提供,但 PRINT 2 & PRINT 3 未显示任何输出。 有人可以帮我调试这段代码吗?


import requests
import json
import pandas as pd
import xlwings as xw
from df2gspread import df2gspread as d2g

import gspread 
from oauth2client.service_account import  ServiceAccountCredentials

pd.set_option('display.width', 1500)
pd.set_option('display.max_columns', 75)
pd.set_option('display.max_row', 2500)

url = "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY"

headers = 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/83.0.4103.106 Safari/537.36',
"accept-language": "en-US,en;q=0.9,hi;q=0.8","accept-encoding": "gzip, deflate, br"

    cookie_dict = 'bm_sv' : 'AA02590AB18B4FC4A036CC62F5230694~8py6nqGfKvu3P4aKZoNpf4HZOUYQJ4i6JMyPMX14ksLZYE+0HlglIA3S2AAa9JGJPvXrBHcJ7uS2ZMcMq3f+FZ/ttHuqFzuAmMf1ZnI9hFgpqB7USISOoa3NfzMufwVAd0U7MgeSxF7+GjuyOuApyOQcoHmyr53hB4JLSqd0U1s'
    
    session = requests.session()
    
    for cookie in cookie_dict:
        session.cookies.set(cookie,cookie_dict[cookie])


expiry = '16-Jul-2020'


def fetch_oi():
   
   r = session.get(url, headers=headers).json()
   #print(r)      PRINT 1 - THIS PRINT IS WORKING 

   if expiry:
      ce_values = [data['CE'] for data in r ['records']['data'] if "CE" in data and str(data['expiryDate'].lower() == str(expiry).lower())]
      pe_values = [data['PE'] for data in r ['records']['data'] if "PE" in data and str(data['expiryDate'].lower() == str(expiry).lower())]
   else:
     ce_values = [data['CE'] for data in r ['filtered']['data'] if "CE" in data]
     pe_values = [data['PE'] for data in r ['filtered']['data'] if "PE" in data]
     print(ce_values) # PRINT 2 NO OUTPUT NO ERROR
     
     ce_data = pd.DataFrame(ce_values)
     pe_data = pd.DataFrame(pe_values)
     ce_data = ce_data.sort_values(['strikePrice'])
     pe_data = pe_data.sort_values(['strikePrice'])
     print(ce_values)      # PRINT 3 NO OUTPUT NO ERROR    
    

def main():
    fetch_oi()

if __name__ == '__main__':
    main()

【问题讨论】:

什么是PRINT 2PRINT 3 我最初可以使用下面提供的答案下载数据,但现在我收到 401 错误。你有没有遇到类似的问题?? 【参考方案1】:

您的 str 转换失败并且 requests 句柄缺少参数,我已经修改了您的代码,应该可以在下面运行

import requests
import json
import pandas as pd

new_url = 'https://www.nseindia.com/api/option-chain-indices?symbol=BANKNIFTY'

headers = 'User-Agent': 'Mozilla/5.0'
page = requests.get(new_url,headers=headers)
dajs = json.loads(page.text)


def fetch_oi(expiry_dt):
    ce_values = [data['CE'] for data in dajs['records']['data'] if "CE" in data and data['expiryDate'] == expiry_dt]
    pe_values = [data['PE'] for data in dajs['records']['data'] if "PE" in data and data['expiryDate'] == expiry_dt]

    ce_dt = pd.DataFrame(ce_values).sort_values(['strikePrice'])
    pe_dt = pd.DataFrame(pe_values).sort_values(['strikePrice'])
    
    print(ce_dt[['strikePrice','lastPrice']])

def main():
    
    expiry_dt = '27-Aug-2020'
    fetch_oi(expiry_dt)

if __name__ == '__main__':
    main()

【讨论】:

但是当我们尝试使用调度程序运行这个程序时,每隔 60 秒 - 它会给出 401 未经授权的错误。对此有什么想法吗? Seetharam Rao:如何打开。每个行使价的高低值?【参考方案2】:

现在他们添加了 2 个主要的 cookie,用于确定您是否是真实用户

Cookie 名称 nsit , nseappid

无法找到这两个 cookie 是如何设置到浏览器中的。

第一次访问 NSE 网站时,这 2 个 cookie 会以某种方式设置,当然会有一些过期时间。对于每个资源请求,例如https://www.nseindia.com/api/option-chain-indices?COUNTER,需要将这两个cookie设置到请求标头中才能获取数据。

【讨论】:

【参考方案3】:

你可以重复调用url直到你得到数据:

url = 'https://www.nseindia.com/api/option-chain-indices?symbol='+symbol
found = False
while not found:
    try:
        data = requests.get(url, headers=urlheader).content
        data2 = data.decode('utf-8')
        df = json.loads(data2)
        expiry_dt = df['records']['expiryDates'][0]

        found = True
    except:
        pass

【讨论】:

以上是关于用 Python 抓取 NSE 期权链数据的主要内容,如果未能解决你的问题,请参考以下文章

用python抓取的网页保存后为啥乱码?

python抓取局域网内数据

如何用python抓取百度地图数据

如何利用python抓取美股数据

怎么用Python写爬虫抓取网页数据

使用python抓取并分析北京链家地产二手房信息