Как я могу получить предложения Amazon по ключевым словам / фразам из панели поиска - PullRequest
1 голос
/ 02 мая 2019

Ниже приведен код, который я нашел и изменил, чтобы попытаться получить предложения по ключевым словам / фразам из панели поиска Amazon. Я очень плохо знаком с концепцией веб-скребинга, поэтому я знаю, что представленный здесь код может быть очень неэффективным и неэффективным. Я вручную захватил некоторые данные из F12 DOM Explorer и окна сети. Если лучшим ответом является веб-очистка, мне нужно это в форме Excel VBA. Я вижу на некоторых из приведенных ниже изображений, что это выглядит так, как будто часть содержимого в окне «Сеть» - это «application / json», а «Инициатор / тип» - «XMLHttpRequest», но это только после того, как он показывает соединение и аутентификацию для "https://completion.amazon.com". Если это маршрут, я не знаю, как выполнить эти запросы. Любая помощь будет принята с благодарностью.

До сих пор я пытался вызывать панель поиска программно, через скрипты в коде, но это ничего не делает, что я вижу. Простое «вставление» ключевого слова в строку поиска с добавленным «пробелом» не дает предложенных ключевых слов. Тем не менее, ввод в строку поиска делает. Если я ввожу ключевое слово, а затем выбираю «проверить элемент» из выпадающего списка предложений, создается динамический HTML-код для отображения содержимого предложений в формате HTML (в это время я могу получить то, что мне нужно). Мне не удалось добраться до этого момента.

Private Sub CommandButton1_Click ()

Dim MyHTML_Element As IHTMLElement
Dim MyURL As String

Dim AASearchRank As Workbook
Dim AAws As Worksheet
Dim InputSearch As HTMLInputTextElement
Dim elems As IHTMLElementCollection
Dim TDelement As HTMLTableCell
Dim elems2 As IHTMLElementCollection
Dim TDelement2 As HTMLDivElement
'Dim TDelement2 As HTMLInputTextElement

Dim InputSearchButton As HTMLInputButtonElement
Dim IE As InternetExplorer

Dim x As Integer
Dim i As Long

MyURL = "https://www.amazon.com/"
Set IE = New InternetExplorer
With IE
    .Silent = True
    .Navigate MyURL
    .Visible = True
    Do
        DoEvents
    Loop Until .ReadyState = READYSTATE_COMPLETE
End With
Set HTMLDoc = IE.Document

Set AASearchRank = Application.ThisWorkbook
Set AAws = AASearchRank.Worksheets("Sheet2")

Set InputSearchButton = HTMLDoc.getElementById("nav-search-submit-text")
Set InputSearchOrder = HTMLDoc.getElementById("twotabsearchtextbox")

If Not InputSearchOrder Is Nothing Then
    InputSearchButton.Click
    Do
        DoEvents
    Loop Until IE.ReadyState = READYSTATE_COMPLETE
End If

x = 2
If AAws.Range("D" & x).Value = "" Then
    Do Until AAws.Range("B" & x) = ""
        Set InputSearch = HTMLDoc.getElementById("twotabsearchtextbox")
        InputSearch.Focus
        'When a keyword is typed in the search bar with a 'space' after, it invokes the suggestions I'm looking for.
        InputSearch.Value = "Travel "
        'InputSearch.Value = AAws.Range("C" & x) & " "

        Set InputSearchButton = HTMLDoc.getElementsByClassName("nav-input")(0)
        InputSearch.Focus

        'Here I was trying to invoke some script to see if it had any effect on the search bar drop down
        HTMLDoc.parentWindow.execScript "window.navmet.push({key:'UpNav',end:+new Date(),begin:window.navmet.tmp});"
        HTMLDoc.parentWindow.execScript "window.navmet.push({key:'Search',end:+new Date(),begin:window.navmet.tmp});"
        HTMLDoc.parentWindow.execScript "window.navmet.push({key:'NavBar',end:+new Date(),begin:window.navmet.main});"

            Do
                DoEvents
            Loop Until IE.ReadyState = READYSTATE_COMPLETE
        'Application.Wait (Now + TimeValue("0:00:05"))


        Set elems2 = HTMLDoc.getElementsByClassName("nav-issFlyout nav-flyout")
        i = 0
        For Each TDelement2 In elems2
                'Debug statements strictly for learning what each option/query returns
                Debug.Print TDelement2.innerText
                Debug.Print TDelement2.className
                Debug.Print TDelement2.dataFld

                Debug.Print TDelement2.innerHTML
                Debug.Print TDelement2.outerText
                Debug.Print TDelement2.outerHTML
                Debug.Print TDelement2.parentElement.className
                Debug.Print TDelement2.tagName
                Debug.Print TDelement2.ID

        Next

        'Once the searchbar is populated, and the drop down list provides suggestions,
        'the below code will give me what I want. If there's an easier solution,
        'I'm all for it
        Set elems = HTMLDoc.getElementsByClassName("s-suggestion")
        i = 0
        For Each TDelement In elems
            If Left(TDelement.ID, 6) = "issDiv" Then
                Debug.Print TDelement.innerText
                Debug.Print TDelement.ID
            End If

        Next
    x = x + 1
    Loop
End If

End Sub

Идеальным решением было бы получить эти предлагаемые ключевые слова либо с помощью динамического HTML панели поиска, либо через сайт завершения Amazon, но кажется, что он может быть закрыт для широкой публики. Благодарим Вас за любую помощь и заранее приносим извинения за недостатки в размещении.

1 Ответ

0 голосов
/ 02 мая 2019

Существует вызов API, который вы можете найти на вкладке сети.Он возвращает строку json, которую вы можете проанализировать как jsonparser , чтобы получить предложения.Я использую jsonconverter.bas, который после загрузки добавляю в проект, а затем захожу в VBE> Инструменты> Ссылки> Добавить ссылку на Microsoft Scripting Runtime.

Сам URL-адрес представляет собой queryString, то есть он построен из различных параметров.,Например, есть параметр limit, значение которого равно 11, которое указывает количество возвращаемых предложений.Вы можете изменить и / или удалить некоторые из них.Ниже я конкатенирую константу SEARCH_TERM в строку запроса, чтобы представить значение вашего поиска (то, которое будет введено в поле поиска).

Я не знаю, являются ли какие-либо из параметров основанными на времени(т.е. истекает со временем - я сделал несколько запросов без проблем, так как вы разместили свой вопрос).Возможно, что необходимые значения, основанные на времени, могут быть получены с помощью предварительного запроса GET на странице поиска Amazon.

params = (
    ('session-id', '141-0042012-2829544'),
    ('customer-id', ''),
    ('request-id', '7E7YCB7AZZM1HQEZF2G1'),
    ('page-type', 'Search'),
    ('lop', 'en_US'),
    ('site-variant', 'desktop'),
    ('client-info', 'amazon-search-ui'),
    ('mid', 'ATVPDKIKX0DER'),
    ('alias', 'aps'),
    ('b2b', '0'),
    ('fresh', '0'),
    ('ks', '76'),
    ('prefix', 'TRAVEL'),
    ('event', 'onKeyPress'),
    ('limit', '11'),
    ('fb', '1'),
    ('suggestion-type', ['KEYWORD', 'WIDGET']),
    ('_', '1556820864750')
)

VBA:

Option Explicit
Public Sub GetTable()
    Dim json As Object, suggestion As Object                '<  VBE > Tools > References > Microsoft Scripting Runtime
    Const SEARCH_TERM As String = "TRAVEL"
    Const SEARCH_TERM2 As String = "BOOKS"
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://completion.amazon.com/api/2017/suggestions?session-id=141-0042012-2829544" & _
        "&customer-id=&request-id=7E7YCB7AZZM1HQEZF2G1&page-type=Search&lop=en_US&site-variant=" & _
        "desktop&client-info=amazon-search-ui&mid=ATVPDKIKX0DER&alias=aps&b2b=0&fresh=0&ks=76&" & _
        "prefix=" & SEARCH_TERM & "&event=onKeyPress&limit=11&fb=1&suggestion-type=KEYWORD&suggestion-type=" & _
        "WIDGET&_=1556820864750", False
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .send
        Set json = JsonConverter.ParseJson(.responseText)("suggestions")
    End With
    For Each suggestion In json
        Debug.Print suggestion("value")
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...