我使用这个程序从
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)
试试这个:
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)
要执行操作,您首先必须执行登录请求调用,该调用将返回您的会话 ID。然后,该会话 ID 将在下一个请求的标头部分中使用,以进行身份验证并返回有效响应
即使我从今天早上开始也遇到同样的错误。早些时候,我仅在印度境外托管的服务器上遇到此问题。但现在看来他们正试图完全停止抓取。
真的很想找到解决方案。
此外,目前旧网站似乎仍在运行。我知道这不是一个永久的解决方案,但我将其作为权宜之计,直到找到更永久的解决方案。
我用 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);
})()
使用 Java 也遇到同样的错误。 解决办法是
根据您使用哪种实现来进行 ssl 调用,您必须找到适当的方法来获取和设置 cookie。 不知道为什么 NSE 网站在数据公开时必须寻找 cookie。 nse 肯定应用了一些额外的技术!.
要解决从
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}")