繁体   English   中英

访问被拒绝 - python selenium - 即使在使用用户代理和其他标头之后

[英]Access denied - python selenium - even after using User-Agent and other headers

使用 python,我试图提取 NSE 交易所在https://www.nseindia.com/option-chain 上公开发布的期权链 data.table

尝试使用请求 session 以及 selenium,但不知何故网站不允许使用机器人提取数据。

以下是所做的尝试:

  1. 尝试设置 session 而不是普通请求,并尝试首先从https://www.nseindia.com/api/csrf-token获取 csrf_token,然后调用 url。但是该网站似乎使用 javascripts 具有某些额外的授权。
  2. 研究chrome developer console的xhr和js tabs,网站第一次授权好像是用了一些js脚本,所以这次用的是selenium。 在加载驱动程序时,还在标头中传递了 useragent 和 Accept-Language arguments(根据这个 stackoverflow 答案)。 但是不知何故访问仍然被网站阻止。

有什么明显的我想念的吗? 或者网站将尽一切努力阻止使用 selenium/requests + python 从网站自动提取数据? 无论哪种情况,我如何提取这些数据?

下面是我当前的代码:(从https://www.nseindia.com/option-chain获取表格内容)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36")
opts.add_argument("Accept-Language=en-US,en;q=0.5")
opts.add_argument("Accept=text/html")


driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe",chrome_options=opts)
#driver.get('https://www.nseindia.com/api/csrf-token')
driver.get('https://www.nseindia.com/')
#driver.get('https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY')
driver.get('https://www.nseindia.com/option-chain')

数据是通过 Javascript 从外部 URL 加载的。但是你需要先加载 cookies 访问其他 URL:

import json
import requests
from bs4 import BeautifulSoup


symbol = 'NIFTY'

headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0'}
url = 'https://www.nseindia.com/api/option-chain-indices?symbol=' + symbol

with requests.session() as s:

    # load cookies:
    s.get('https://www.nseindia.com/get-quotes/derivatives?symbol=' + symbol, headers=headers)

    # get data:
    data = s.get(url, headers=headers).json()

    # print data to screen:
    print(json.dumps(data, indent=4))

印刷:

{
    "records": {
        "expiryDates": [
            "03-Sep-2020",
            "10-Sep-2020",
            "17-Sep-2020",
            "24-Sep-2020",
            "01-Oct-2020",
            "08-Oct-2020",
            "15-Oct-2020",
            "22-Oct-2020",
            "29-Oct-2020",
            "26-Nov-2020",
            "31-Dec-2020",
            "25-Mar-2021",
            "24-Jun-2021",
            "30-Dec-2021",
            "30-Jun-2022",
            "29-Dec-2022",
            "29-Jun-2023"
        ],
        "data": [
            {
                "strikePrice": 4600,
                "expiryDate": "31-Dec-2020",
                "PE": {
                    "strikePrice": 4600,
                    "expiryDate": "31-Dec-2020",
                    "underlying": "NIFTY",
                    "identifier": "OPTIDXNIFTY31-12-2020PE4600.00",
                    "openInterest": 19,
                    "changeinOpenInterest": 0,
                    "pchangeinOpenInterest": 0,
                    "totalTradedVolume": 0,
                    "impliedVolatility": 0,
                    "lastPrice": 31,
                    "change": 0,
                    "pChange": 0,
                    "totalBuyQuantity": 10800,
                    "totalSellQuantity": 0,
                    "bidQty": 900,
                    "bidprice": 3.05,
                    "askQty": 0,
                    "askPrice": 0,
                    "underlyingValue": 11647.6
                }
            },
            {
                "strikePrice": 5000,
                "expiryDate": "31-Dec-2020",

...and so on.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM