Python 请求 get 返回 nse 印度网站的响应代码 401

问题描述 投票:0回答:6

我使用这个程序从

https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY
获取json数据 但从今天早上开始它就不再工作了,因为它返回了
<Response [401]>
。不过,该链接在 Chrome 上加载得很好。有没有什么方法可以在不使用硒的情况下解决这个问题?

import json
import requests

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, '
                         'like Gecko) '
                         'Chrome/80.0.3987.149 Safari/537.36',
           'accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'}

res = requests.get("https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY", headers=headers)
print(res)

python python-3.x web-scraping python-requests
6个回答
24
投票

试试这个:

import requests

baseurl = "https://www.nseindia.com/"
url = f"https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY"
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, '
                         'like Gecko) '
                         'Chrome/80.0.3987.149 Safari/537.36',
           'accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'}
session = requests.Session()
request = session.get(baseurl, headers=headers, timeout=5)
cookies = dict(request.cookies)
response = session.get(url, headers=headers, timeout=5, cookies=cookies)
print(response.json())

要多次访问 NSE(api)站点,然后在每个后续请求中设置

cookies

response = session.get(url, headers=headers, timeout=5, cookies=cookies)


0
投票

要执行操作,您首先必须执行登录请求调用,该调用将返回您的会话 ID。然后,该会话 ID 将在下一个请求的标头部分中使用,以进行身份验证并返回有效响应


0
投票

即使我从今天早上开始也遇到同样的错误。早些时候,我仅在印度境外托管的服务器上遇到此问题。但现在看来他们正试图完全停止抓取。

真的很想找到解决方案。

此外,目前旧网站似乎仍在运行。我知道这不是一个永久的解决方案,但我将其作为权宜之计,直到找到更永久的解决方案。


0
投票

我用 Node js 尝试了同样的事情 请使用 Node js ide 这里有在线 ide 的链接 请检查我的代码

const axios = require('axios');


let cookie;
let url_oc = "https://www.nseindia.com/option-chain"
let url = "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY"
let headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
  'accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'
}

const instance = axios.create({
  baseURL: url_oc,
  headers: headers,
  cookie: cookie ? cookie : ""
});



const getCookies = async () => {
  try {
    const response = await instance.get(url_oc);
    cookie = response.headers['set-cookie'].join();
  } catch (error) {
    if (error.response.status === 403) {
      console.log("getCookies =========> error.status === 403");
      await getCookies()
    } else {
      console.log("getCookies =========> error");
    }
  }
}


const getAPIData = async () => {
  try {
    if (cookie) {
      const response = await instance.get(url);
      console.log(response.data.records.timestamp);
    }

  } catch (error) {
    if (error.response && error.response.status === 401) {
      console.log("getAPIData =========> error.status === 401");
      if (!cookie) {
        console.log("getAPIData =========> cookie not found");
        await getCookies()
      }
      await getAPIData()
    } else {
      console.log("getAPIData =========> error");
    }
  }
}



(async () => {
  setInterval(async () => {
    await getCookies()
  }, 5000);

  setInterval(async () => {
    await getAPIData()
  }, 3000);
})()

0
投票

使用 Java 也遇到同样的错误。 解决办法是

  • 首先连接到 https://nseindia.com
  • 然后读取服务器返回的cookie。
  • 在您的请求中添加相同的 cookie。

根据您使用哪种实现来进行 ssl 调用,您必须找到适当的方法来获取和设置 cookie。 不知道为什么 NSE 网站在数据公开时必须寻找 cookie。 nse 肯定应用了一些额外的技术!.


0
投票

要解决从

https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY
获取 JSON 数据时出现的 401 Unauthorized 错误,请使用
requests.Session()
维护会话状态并处理 cookie。首先,向基本 URL 发出请求以建立会话,然后使用同一会话请求数据。这是代码:

import requests

base_url = "https://www.nseindia.com/"
url = "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
    'Accept-Language': 'en,gu;q=0.9,hi;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br'
}

with requests.Session() as session:
    session.get(base_url, headers=headers)  # Establish session
    response = session.get(url, headers=headers)  # Fetch data
    if response.ok:
        data = response.json()
        print(data)
    else:
        print(f"Error: {response.status_code}")
© www.soinside.com 2019 - 2024. All rights reserved.