网络查询的动态URL

问题描述 投票:0回答:1

我曾经使用附加的宏代码从“ 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

有人可以建议..

excel vba url dynamic
1个回答
0
投票

您似乎未尝试任何操作。

我仅发布此教育文章,希望它可能会启发您将来编写自己的代码。

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

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

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

enter image description here

如果查看请求的标题和参数,您将看到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

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

您将需要在项目中添加以下参考(VBE>工具>参考):

Microsoft XML version 6.0
Microsoft Scripting Runtime

您还需要将this JSON parser添加到您的项目中。请按照链接中的安装说明进行操作,然后就可以开始使用了。

结果

这里是从1/2/2020到29/2/2020期间的结果示例

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.