0

我曾经使用附加的宏代码从“nseindia”网站下载数据。

宏执行以下工作。

  1. 从“输入”表中获取有关索引名称、开始日期和结束日期的输入。
  2. 根据输入数据生成 URL。第二张表中提到了动态创建的 URL。

在此 URL 中,“NIFTY%20BANK&fromDate=30-09-2017&toDate=31-10-2017”是根据用户输入动态创建的整个 URL 的一部分。

  1. 以 CSV 格式下载此链接上的可用数据,并将其放入“总回报指数”表中。CSV 文件在 Web 浏览器本身中打开。

旧 - 访问 nseindia 网站 -> 转到顶部的“产品”选项卡 -> 选择“指数” -> 选择“历史数据” -> 选择“查看总回报” -> 从下拉列表中选择指数为“Nifty 50” ->输入开始和结束日期 -> 点击“获取数据”按钮 -> 点击“以 csv 格式下载文件”

旧网站:https ://www1.nseindia.com/products/content/equities/indices/historical_index_data.htm

新 - 访问 niftyindices 网站 - 到顶部的“报告”选项卡 -> 选择“历史数据” -> 从左上角的下拉列表中选择“总回报指数值” -> 选择开始日期和结束日期 -> 按“提交" 按钮 -> 点击 "csv 格式"

新网站:https ://www.niftyindices.com/reports/historical-data

有人可以建议..

4

1 回答 1

0

你似乎没有尝试过任何事情。

我只是发布这篇教育文章,希望它可以激励你在未来编写自己的代码。

正如我在评论中所说,您尝试抓取的网站提供了一种非常方便的方式来通过 HTTP 请求下载您想要的数据。

HTTP 请求是一种从服务器请求某些内容的结构化方式。在这种情况下,我们要向服务器发送两个日期并获取相应的搜索结果。

要了解此请求的外观,您必须在单击提交按钮时检查网络流量。您可以通过浏览器的开发者工具 ( F12) 做到这一点:

在此处输入图像描述

如果您浏览请求的标头和参数,您将看到 url、正文和标头的外观。在这种特殊情况下,所有参数都以 JSON 格式在请求正文中发送,并且大多数标头对于请求的成功并不重要。

请求的正文如下所示:

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

在这种特殊情况下,响应的有效负载是另一个 json 字符串中的 json 字符串。您可以使用这样的工具检查其结构。这是第二个 json 的样子:

在此处输入图像描述

它基本上由每个请求日期的一个项目组成,每个项目由 7 个参数及其对应的值组成。

代码

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

上面用于演示的代码从空的 Excel 工作表的单元格 A2 开始打印结果。您可以修改代码以最适合您的需求。

您需要将以下引用添加到您的项目中(VBE>Tools>References):

Microsoft XML version 6.0
Microsoft Scripting Runtime

您还需要将此 JSON 解析器添加到您的项目中。按照链接中的安装说明进行操作,您应该可以开始使用了。

结果

以下是 2020 年 1 月 2 日至 2020 年 2 月 29 日期间的结果样本

在此处输入图像描述

于 2020-03-01T11:54:38.460 回答