Очистка таблицы от данных

#vba #web-scraping

#vba #веб-очистка

Вопрос:

Мне нужна помощь, чтобы загрузить таблицу stock, расположенную по этому <a rel="noreferrer noopener nofollow" href="https://es.investing.com/stock-screener/?sp=country::5|sector::a|industry::a|equityType::a|exchange::a|eq_market_cap::110630000,1990000000000URL:

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

 <a target=”_blank”href=”/equities/apple-computer-inc” title=Apple Inc”>Apple</a>
  

Я вижу только:

A title={fullName} href="about:{pairLink}" target=_blank>{pairName}

Это код, который я собрал:

  Sub table()
    Dim XMLReq As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    
    Dim Tables As MSHTML.IHTMLElementCollection
    Dim table As MSHTML.IHTMLElement
    Dim TableRow As MSHTML.IHTMLElement
    
    XMLReq.Open "GET", "https://es.investing.com/stock-screener/?sp=country::5|sector::a|industry::a|equityType::a|exchange::a|eq_market_cap::110630000,1990000000000<eq_market_cap;2", False
    XMLReq.send
    
    If XMLReq.Status <> 200 Then
        MsgBox "problem" amp; vbNewLine amp; XMLReq.Status amp; "- " amp; XMLReq.statusText
        Exit Sub
    End If
    
    HTMLDoc.body.innerHTML = XMLReq.responseText

    Set Tables = HTMLDoc.getElementsByTagName("Table")
    
    For Each table In Tables

        If table.className = "displayNone genTbl openTbl resultsStockScreenerTbl elpTbl " Then
            For Each TableRow In table.getElementsByTagName("td")
                Debug.Print TableRow.innerHTML
            Next
        End If
    
    Next table
    
End Sub
  

Любая помощь будет оценена.

Комментарии:

1. Вероятно, динамическая веб-страница, на которой нужный вам контент поступает с другого URL-адреса через запрос xhr, который текущая страница делает для обновления содержимого. Обычно их можно просмотреть с помощью инструментов разработки в браузере или с помощью инструментов сетевого мониторинга, например, wireshark. Поскольку динамическое содержимое не будет присутствовать в первоначальном запросе, который вы делаете. Вы можете проверить это, отключив javascript в браузере и повторно загрузив содержимое. Если динамический, то нужного вам содержимого там не будет, и вы получите нечто похожее на то, что вы видите в своем коде выше.

Ответ №1:

Похоже, что фактические данные, которые заполняют таблицу, извлекаются из JSON из другого запроса, который какой-то javascript или что-то еще запускается на странице. Это может упростить анализ ответа с помощью анализатора json, но может быть сложно составить правильный запрос для получения нужных данных. Владельцы веб-сайта могут не захотеть, чтобы вы это делали, поэтому им может быть нелегко. введите описание изображения здесь

Это выглядит как POST-запрос с набором параметров, а также отправленный файл cookie. Итак, в основном вам нужно будет заново создать этот POST-запрос, добавив все правильные параметры и правильный файл cookie в заголовок. Я бы получил программу веб-отладки, такую как fiddler (показано выше), чтобы посмотреть и посмотреть, что происходит.

Я собирался также предложить вам проверить и посмотреть, предоставляет ли этот веб-сайт API, но, похоже, это не так?

РЕДАКТИРОВАТЬ: я действительно смог получить JSON с нужными вам данными, просто скопировав запрос, используемый на сайте:

  Sub getdata()
    Dim XMLReq As New MSXML2.XMLHTTP60
    
    XMLReq.Open "POST", "https://es.investing.com/stock-screener/Service/SearchStocks", False
    XMLReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    XMLReq.setRequestHeader "Accept", "application/json"
    XMLReq.setRequestHeader "X-Requested-With", "XMLHttpRequest"
    
    XMLReq.send "country[]=5amp;exchange[]=95amp;exchange[]=2amp;exchange[]=1amp;sector=5,12,3,8,9,1,7,6,2,11,4,10amp;industry=74,56,73,29,25,4,47,12,8,44,52,45,71,99,65,70,98,40,39,42,92,101,6,30,59,77,100,9,50,46,88,94,62,75,14,51,93,96,34,55,57,76,66,5,3,41,87,67,85,16,90,53,32,27,48,24,20,54,33,19,95,18,22,60,17,11,35,31,43,97,81,69,102,72,36,78,10,86,7,21,2,13,84,1,23,79,58,49,38,89,63,64,80,37,28,82,91,61,26,15,83,68amp;equityType=ORD,DRC,Preferred,Unit,ClosedEnd,REIT,ELKS,OpenEnd,Right,ParticipationShare,CapitalSecurity,PerpetualCapitalSecurity,GuaranteeCertificate,IGC,Warrant,SeniorNote,Debenture,ETF,ADR,ETC,ETNamp;eq_market_cap[min]=110630000amp;eq_market_cap[max]=1990000000000amp;pn=1amp;order[col]=eq_market_capamp;order[dir]=d"
    
    If XMLReq.Status <> 200 Then
        MsgBox "problem" amp; vbNewLine amp; XMLReq.Status amp; "- " amp; XMLReq.statusText
        Exit Sub
    End If
    
    Debug.Print XMLReq.responseText
    
End Sub
  

Итак, теперь вам просто нужно выяснить, как проанализировать ответ JSON.

Комментарии:

1. Привет @garbb, это работает отлично! Большое спасибо. Действительно, разработчики этой страницы сделали невозможное, чтобы испортить первомай. Формат JSON, который они используют, неправильно анализируется с помощью JSonConverte, который я обычно использую ( github.com/VBA-tools/VBA-JSON ).