Dynami c URL для веб-запроса - PullRequest
       6

Dynami c URL для веб-запроса

0 голосов
/ 28 января 2020

Раньше я загружал данные с веб-сайта «nseindia», используя прикрепленный код макроса.

Макрос выполняет следующую работу.

  1. принимает входные данные из листа «Входные данные» об имени индексов , даты начала и окончания.
  2. Создание URL-адреса в соответствии с входными данными. Динамически созданный URL-адрес упоминается во втором листе.

В этом URL-адресе «NIFTY% 20BANK & fromDate = 30-09-2017 & toDate = 31-10-2017» - это динамически создаваемая часть целого URL-адреса, основанная на пользовательском вводе.

Загрузить данные, доступные по этой ссылке в формате CSV, на листе «Индекс общего дохода». Файл CSV открывается в самом веб-браузере.

Старый - посетите сайт nseindia -> go на вкладке «продукт» вверху -> выберите «Индексы» -> выберите «История c» Данные »-> Выбрать« Просмотреть общий доход »-> Выбрать индекс как« Nifty 50 »из выпадающего списка -> ввести дату начала и окончания -> нажать кнопку« Получить данные »-> нажать« Загрузить файл в формате CSV »

старый веб-сайт: https://www1.nseindia.com/products/content/equities/indices/historical_index_data.htm

Новое - перейти на сайт niftyindices - перейти на вкладку «отчеты» вверху -> выбрать «Исторические данные» -> выбрать «Значение индекса общего дохода» "из выпадающего списка слева вверху -> выберите дату начала и дату окончания -> нажмите кнопку" отправить "-> нажмите" формат csv "

новый веб-сайт: https://www.niftyindices.com/reports/historical-data

Может кто-нибудь посоветовать ..

1 Ответ

0 голосов
/ 01 марта 2020

Вы, похоже, ничего не предпринимали.

Я только публикую этот учебный пост, надеясь, что это может вдохновить вас на написание собственного кода в будущем.

Как я уже говорил в комментариях, веб-сайт, который вы пытаетесь очистить, предлагает очень удобный способ загрузки нужных данных через HTTP-запрос.

HTTP-запрос является структурированным способ запросить что-то с сервера. В этом случае мы хотим отправить две даты на сервер и получить соответствующие результаты поиска.

Чтобы узнать, как должен выглядеть этот запрос, вы должны проверить сетевой трафик c, когда кнопка отправки щелкнул. Вы можете сделать это через инструменты разработчика вашего браузера ( F12 ):

enter image description here

Если вы go через Заголовки и По параметрам запроса вы увидите, как должны выглядеть URL, тело и заголовки. В этом конкретном случае все параметры отправляются в теле запроса в формате JSON, и большинство заголовков не являются необходимыми для успеха запроса.

Тело запроса выглядит так:

{'name':'NIFTY 50','startDate':'01-Feb-2020','endDate':'29-Feb-2020'} 

В этом конкретном случае полезной нагрузкой ответа является строка json внутри другой строки json. Вы можете проверить его структуру с помощью инструмента, подобного this . Вот как выглядит второй json:

enter image description here

В основном он состоит из одного элемента на запрошенную дату, и каждый элемент состоит из 7 параметров и соответствующих им значения.

CODE

Option Explicit

Sub nse()
Dim req As New MSXML2.XMLHTTP60
Dim url As String, defaultPayload As String, requestPayload As String, results() As String
Dim payloadJSON As Object, responseJSON As Object, item As Object
Dim startD As Date, endD As Date
Dim key As Variant
Dim i As Long, j As Long
Dim rng As Range

startD = "01/02/2020" 'change the date to whichever you want
endD = "29/02/2020" 'change the date to whichever you want
url = "https://www.niftyindices.com/Backpage.aspx/getHistoricaldatatabletoString"
defaultPayload = "{'name':'NIFTY 50','startDate':'','endDate':''}"
Set rng = ThisWorkbook.Worksheets("Name of your Worksheet").Range("A2") 'use the name of the worksheet in which you want the results to be printed.


Set payloadJSON = JsonConverter.ParseJson(defaultPayload)
payloadJSON("startDate") = Day(startD) & "-" & MonthName(Month(startD), True) & "-" & Year(startD) '01-Feb-2020
payloadJSON("endDate") = Day(endD) & "-" & MonthName(Month(endD), True) & "-" & Year(endD) '29-Feb-2020
requestPayload = JsonConverter.ConvertToJson(payloadJSON)

With req
    .Open "POST", url, False
    .setRequestHeader "Content-Type", "application/json; charset=UTF-8"
    .setRequestHeader "X-Requested-With", "XMLHttpRequest"
    .send requestPayload
    Set responseJSON = JsonConverter.ParseJson(.responseText)
End With
Debug.Print responseJSON("d")
Set responseJSON = JsonConverter.ParseJson(responseJSON("d"))
ReDim results(1 To responseJSON.Count, 1 To 7)
i = 0
For Each item In responseJSON
    i = i + 1
    j = 0
    For Each key In item
        j = j + 1
        results(i, j) = item(key)
    Next key
Next item
rng.Resize(UBound(results, 1), UBound(results, 2)) = results
End Sub

Приведенный выше код в демонстрационных целях выводит результаты, начиная с ячейки A2 пустой рабочей таблицы Excel. Вы можете изменить код так, чтобы он наилучшим образом соответствовал вашим потребностям.

Вам потребуется добавить следующие ссылки на ваш проект (VBE> Инструменты> Ссылки):

Microsoft XML version 6.0
Microsoft Scripting Runtime

Вам также потребуется Добавьте этот JSON парсер в ваш проект. Следуйте инструкциям по установке, приведенным в ссылке, и вы должны установить go.

РЕЗУЛЬТАТЫ

Вот пример результатов за период 1/2/2020 до 29/2/2020

enter image description here

...