#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 ).