簡體   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