Как устранить ошибку «ПЛОХОЙ ЗАПРОС» при попытке импортировать данные из гиперссылки в Excel с помощью макросов? - PullRequest
0 голосов
/ 06 мая 2020

Я хочу импортировать данные с веб-сайта https://www.amfiindia.com/nav-history-download. На этой странице есть ссылка «Загрузить полный отчет NAV в текстовом формате», по которой я могу получить необходимые данные. Но эта ссылка не является stati c, поэтому я не могу использовать ее непосредственно в VBA для загрузки своих данных. Итак, как загрузить данные из гиперссылки на веб-странице с помощью Excel?

Мой подход заключается в том, чтобы сначала получить гиперссылку в переменной, а затем использовать эту переменную для получения данных? получите гиперссылку с помощью функции getElementsByTagName, как показано ниже.

Затем используйте это как URL-адрес для получения данных.

Но я получаю ответ «ПЛОХОЙ ЗАПРОС» во время отправки запрос на эту гиперссылку. Я не знаю, почему возникает эта ошибка. Код, который я использовал:

Sub GrabLastNames()

    'dimension (set aside memory for) our variables
    Dim objIE As InternetExplorer
    Dim ele As Object
    Dim y As Integer
    Dim mtbl As String
    Dim request As Object
    Dim html As New HTMLDocument
    Dim website As String
    Dim price As Variant
    Dim cellAddress As String
    Dim rowNumber As Long



    'start a new browser instance
    Set objIE = New InternetExplorer
    'make browser visible
    objIE.Visible = True

    'navigate to page with needed data
    objIE.navigate "https://www.amfiindia.com/nav-history-download"
    'wait for page to load
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    ' ht.querySelector(".nav-hist-dwnld a").href
    'we will output data to excel, starting on row 1
    y = 1
    mtbl = objIE.document.querySelector(".nav-hist-dwnld a").href

    ' mtbl = Sheets("Sheet1").Range("A" & y).Value

    ' Website to go to.
    ' website = mtbl

    ' Create the object that will make the webpage request.
    Set request = CreateObject("MSXML2.XMLHTTP")

    ' Where to go and how to go there - probably don't need to change this.
    request.Open "GET", mtbl, False


    ' Get fresh data.
    request.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"

    ' Send the request for the webpage.
    request.send

    '    MsqBox "bye"

    ' Get the webpage response data into a variable.
    response = request.responseText



    ' Put the webpage into an html object to make data references easier.
    'html.body.innerHTML = response

     MsgBox "Hi"
    '   MsgBox "Bye Bye"

    ' Get the price from the specified element on the page.

    Sheets("Sheet1").Range("A" & y + 1).Value = "Hi"

    MsgBox response


    'look at all the 'tr' elements in the 'table' with id 'myTable',
    'and evaluate each, one at a time, using 'ele' variable

    ActiveWorkbook.Save

End Sub


Переменная ответа должна содержать все данные с веб-сайта, но вместо этого она выводит этот «неверный запрос» в msgBox.

1 Ответ

1 голос
/ 10 мая 2020

Вы устанавливаете заголовки типа this , т.е. с помощью метода .setrequestheader.

Я вижу эту информацию в заголовке:

GET /spages/NAVAll.txt?t=06052020095056 HTTP/1.1
Host: www.amfiindia.com
Connection: keep-alive
Cache-Control: max-age=0
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cookie: __utma=57940026.1471746098.1588710696.1588710696.1588710696.1; __utmc=57940026; __utmz=57940026.1588710696.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
If-None-Match: "0d8e9bad223d61:0"
If-Modified-Since: Wed, 06 May 2020 18:18:24 GMT 

Маловероятно, что вам все это понадобится, но, скорее всего, для 403 вам понадобится пользовательский агент. например, setRequestHeader "User-Agent","Mozilla/5.0"

...