Использование MSXML2.XMLHTTP в доступе VBA не извлекает все данные страницы - PullRequest
0 голосов
/ 28 апреля 2019

В настоящее время мы используем приведенный ниже код для извлечения данных, но код не извлекает полные данные с веб-страницы, код игнорирует данные, которые видны, когда я включаю сценарий Java и хранилище DOM в Internet Explorer.

до сих пор я использую указанный ниже код, конечный код извлекает все, что принимает изображения с веб-страницы.

Мой код получил удар.

Set http = CreateObject("MSXML2.XMLHTTP")

    http.Send
    html.body.innerHTML = http.ResponseText

    On Error GoTo 0
    html1 = html.body.innerHTML
     brand5 = html.documentElement.innerHTML
     If html1 Like "*media__thumb*" Then
other_img = html.getElementsByClassName("media__thumb")(0).innerText
'other_img = other_img.innerHTML
End If

На веб-странице приведен HTML-код с несколькими изображениями ниже (обратите внимание, что мой код выше не извлекает данные из нижеуказанного HTML-кода.


            <a class="media__thumbnail" data-media_type="IMAGE" data-media_id="orbit-bagged-53017-64" data-target="IMAGE" data-has-index="true">
                <img src="https://images.yourweb/_145.jpg">
            </a>
            <a class="media__thumbnail media__thumbnail--selected" data-media_type="IMAGE" data-media_id="orbit-bagged-53017-e1" data-target="IMAGE" data-has-index="true">
                <img src="https://images.yourweb1_145.jpg">
            </a>
            </span></a>

http.response приведен ниже

<div id="thumbnails" class="media__thumbnails" data-component="thumbnails"></div>

    <script type="text/template" id="media__thumbnails">
        {{#thumbnails}}
            <a class="media__thumbnail" data-media_type="{{type}}" data-media_id="{{id}}" data-target="{{type}}" data-has-index="true">
                <img src="{{{thumb}}}"/>
                {{# hasIcon}}
                  {{# threeSixtyIcon}} <div class="whitespace"><span class="threesixtyIcon"></span></div>{{/ threeSixtyIcon}}
                  {{^ threeSixtyIcon}} <span class="videoIcon"></span>{{/ threeSixtyIcon}}
                {{/ hasIcon}}
            </a>
        {{/thumbnails}}
        {{#additionalThumbnailsThumbnail}}
            <a class="media__thumbnail media__thumbnail-additional-count" data-media_type="{{type}}" data-media_id="{{id}}" data-target="{{type}}" data-has-index="true">
                <img src="{{{thumb}}}"/>
                {{# hasIcon}}
                  {{# threeSixtyIcon}} <div class="whitespace"><span class="threesixtyIcon"></span></div>{{/ threeSixtyIcon}}
                  {{^ threeSixtyIcon}} <span class="videoIcon"></span>{{/ threeSixtyIcon}}
                {{/ hasIcon}}
                {{#additionalImagesCount}}
                    <div class="media__thumbnail-overlay"></div>
                    <span class="media__thumbnail-count">+{{additionalImagesCount}}</span>
                {{/additionalImagesCount}}
            </a>

1 Ответ

0 голосов
/ 28 апреля 2019

Для этого содержимого на странице должен был работать javascript, поэтому вам потребуется:

  1. Искать информацию для этих частей этих URL-адресов в веб-трафике, чтобы узнать, получаете ли вы откуда-либо (Вы можете - показано ниже);или
  2. Автоматизируйте браузер, например, с помощью интернет-элементов управления Microsoft

Из следующего видно, что контент загружается динамически:

 <script type="text/template" id="media__thumbnails">
        {{#thumbnails}}
            <a class="media__thumbnail" data-media_type="{{type}}" data-media_id="{{id}}" data-target="{{type}}" data-has-index="true">
                <img src="{{{thumb}}}"/>
                {{# hasIcon}}
                  {{# threeSixtyIcon}} <div class="whitespace"><span class="threesixtyIcon"></span></div>{{/ threeSixtyIcon}}
                  {{^ threeSixtyIcon}} <span class="videoIcon"></span>{{/ threeSixtyIcon}}
                {{/ hasIcon}}
            </a>
        {{/thumbnails}}
        {{#additionalThumbnailsThumbnail}}
        ...... 
        {{/additionalThumbnails}}
    </script>
    <script type="text/template" 

1) Вкладка «Сеть» - другой URL-адрес

Использование другого URL-адреса, найденного на вкладке «Сеть», возвращающего json, содержащий ссылки.Ответ - json, поэтому требуется jsonparser .

'VBE>Tools> References> Add reference to Microsoft Scripting Runtime
'Download and add in jsonconverter.bas from https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas

Поместите код converter.bas в module2 и закомментируйте строку: Attribute VB_Name = "JsonConverter"

В module1 поместите подпункт GetInfo.

Option Compare Database
Option Explicit
Public Sub GetInfo()
    Dim json As Object, url1 As String, url2 As String, url3 As String

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.homedepot.com/p/svcs/frontEndModel/100001020?_=1556447908065", False
        .send
        Set json = Module2.ParseJson(.responseText)
    End With
    'Parse json object (see paths shown below for example)
     url1 = json("primaryItemData")("media")("mediaList")(2)("location")
     url2 = json("primaryItemData")("media")("mediaList")(3)("location")
     url3 = json("primaryItemData")("media")("mediaList")(4)("location")   'example
    Stop '<==delete me later
End Sub

Пути к первым 3 миниатюрам:

json►primaryItemData►media►mediaList►2►location
json►primaryItemData►media►mediaList►3►location
json►primaryItemData►media►mediaList►4►location

Изучите json здесь .


2) Автоматический браузер (версия IE):

'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub GetImageLinks()
    Dim ie As New InternetExplorer, images As Object, i As Long
    With ie
        .Visible = True
        .Navigate2 "https://www.homedepot.com/p/Orbit-Sandstone-Rock-Valve-Box-Cover-53017/100001020"

        While .Busy Or .readyState < 4: DoEvents: Wend
        Set images = .document.querySelectorAll(".media__thumbnail img")

        For i = 0 To images.Length - 1
            Debug.Print images.item(i).src
        Next

        Stop
        .Quit
    End With
End Sub
...