Как использовать запросы или другой модуль для получения данных со страницы, где URL не меняется? - PullRequest
0 голосов
/ 08 января 2019

Я сейчас использую selenium для перехода на страницу:

https://www.nseindia.com/products/content/derivatives/equities/historical_fo.htm

Затем выберите соответствующие опции и нажмите кнопку Get Data.

Затем извлекаем таблицу, сгенерированную с помощью BeautifulSoup.

Есть ли способ использовать запросы в этом случае? Если это так, если кто-то может указать мне учебник?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вам придется протестировать его, попробовав другие значения в словаре query, но я смог вернуть таблицу с сформированным URL, использованным для получения http-запроса

import requests
import pandas as pd

query = {  # just mimicking sample query that I saw after loading link
'instrumentType': 'OPTIDX',
'symbol': 'BANKNIFTY',
'expiryDate': 'select',
'optionType': 'CE',
'strikePrice': '23700',
'dateRange': '',
'fromDate': '05-06-2017',
'toDate': '08-06-2017',
'segmentLink': '9',
'symbolCount': '',
}





url = 'https://www.nseindia.com/products/dynaContent/common/productsSymbolMapping.jsp?\
instrumentType=%s\
&symbol=%s\
&expiryDate=%s\
&optionType=%s\
&strikePrice=%s\
&dateRange=%s\
&fromDate=%s\
&toDate=%s\
&segmentLink=%s\
&symbolCount=%s' %(query['instrumentType'],
  query['symbol'],
  query['expiryDate'],
  query['optionType'],
  query['strikePrice'],
  query['dateRange'],
  query['fromDate'],
  query['toDate'],
  query['segmentLink'],
  query['symbolCount']
  )

response = requests.get(url)

table = pd.read_html(response.text)
table[0]

Выход:

0   Historical Contract-wise Price Volume Data        ...                      NaN
1                                       Symbol        ...         Underlying Value
2                                    BANKNIFTY        ...                 23459.65
3                                    BANKNIFTY        ...                 23459.65
4                                    BANKNIFTY        ...                 23459.65
5                                    BANKNIFTY        ...                 23459.65
...

[42 rows x 17 columns]
0 голосов
/ 08 января 2019

Когда вы выбираете опции, вы более или менее просто устанавливаете параметры для кнопки «Получить данные», чтобы сделать запрос к их бэкэнду. Если вы имитируете запрос, как в случае с этим curl:

curl 'https://www.nseindia.com/products/dynaContent/common/productsSymbolMapping.jsp?instrumentType=FUTIDX&symbol=NIFTYMID50&expiryDate=31-12-2020&optionType=select&strikePrice=&dateRange=day&fromDate=&toDate=&segmentLink=9&symbolCount=' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' -H 'Accept: */*' -H 'Referer: https://www.nseindia.com/products/content/derivatives/equities/historical_fo.htm' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: no-cache' --compressed

Тогда вы можете сделать то же самое в запросах:

import requests

headers = {
    'Pragma': 'no-cache',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
    'Accept': '*/*',
    'Referer': 'https://www.nseindia.com/products/content/derivatives/equities/historical_fo.htm',
    'X-Requested-With': 'XMLHttpRequest',
    'Connection': 'keep-alive',
    'Cache-Control': 'no-cache',
}

params = (
    ('instrumentType', 'FUTIDX'),
    ('symbol', 'NIFTYMID50'),
    ('expiryDate', '31-12-2020'),
    ('optionType', 'select'),
    ('strikePrice', ''),
    ('dateRange', 'day'),
    ('fromDate', ''),
    ('toDate', ''),
    ('segmentLink', '9'),
    ('symbolCount', ''),
)

response = requests.get('https://www.nseindia.com/products/dynaContent/common/productsSymbolMapping.jsp', headers=headers, params=params)

Хороший сайт для изучения, как это сделать:

https://curl.trillworks.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...