Html 如何检索Amazon';搜索栏中的关键字/短语建议

Html 如何检索Amazon';搜索栏中的关键字/短语建议,html,excel,vba,dom,web-scraping,Html,Excel,Vba,Dom,Web Scraping,下面是我找到并修改的一些代码,试图从Amazon的搜索栏中捕获关键字/短语建议。我对网页抓取的概念非常陌生,所以我知道这里提供的代码可能非常低效和低效。我已经从F12 DOM资源管理器和网络窗口手动捕获了一些数据。如果最好的答案是网页抓取,我需要在excel vba的形式。我在下面的一些图片中看到,似乎网络窗口中的某些内容类型是“application/json”,而启动器/类型是“XMLHttpRequest”,但这只是在它显示到“”的连接和身份验证之后。如果这是路线,我不知道如何完成这些请求

下面是我找到并修改的一些代码,试图从Amazon的搜索栏中捕获关键字/短语建议。我对网页抓取的概念非常陌生,所以我知道这里提供的代码可能非常低效和低效。我已经从F12 DOM资源管理器和网络窗口手动捕获了一些数据。如果最好的答案是网页抓取,我需要在excel vba的形式。我在下面的一些图片中看到,似乎网络窗口中的某些内容类型是“application/json”,而启动器/类型是“XMLHttpRequest”,但这只是在它显示到“”的连接和身份验证之后。如果这是路线,我不知道如何完成这些请求。任何帮助都将不胜感激

到目前为止,我已经尝试通过代码中的脚本以编程方式调用搜索栏,但我看不到这一点。简单地将关键字“粘贴”到搜索栏并附加“空格”不会生成建议的关键字。但是,在搜索栏中键入内容会产生影响。如果我键入关键字,然后选择下拉建议的“inspect element”,则会生成动态HTML以显示建议的HTML内容(此时我可以获得所需内容)。我没能做到这一点

私有子命令按钮1_单击()

端接头


一个理想的解决方案是通过调用搜索栏动态HTML或通过Amazon的完成站点来获取这些建议的关键字,但这似乎并不向公众开放。感谢您提供的帮助,并对任何发布缺陷表示歉意。

您可以在“网络”选项卡中找到一个API调用。它返回一个json字符串,您可以使用该字符串进行解析以获得建议。我使用jsonconverter.bas,下载后,我将其添加到项目中,然后转到VBE>工具>引用>添加对Microsoft脚本运行时的引用

url本身是一个查询字符串,即它由不同的参数构成。例如,有一个
limit
参数,其值为
11
,它指定要返回的建议数量。您可以更改和/或删除其中一些。下面,我将
SEARCH\u TERM
常量连接到查询字符串中,以表示您的搜索值(将在搜索框中键入的值)

我不知道是否有任何参数是基于时间的(即随着时间的推移而过期-自从您发布问题以来,我已经提出了许多没有问题的请求)。这可能是必要的基于时间的值可以通过事先获取亚马逊搜索页面的请求来提取

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:

选项显式
公共子GetTable()
Dim json作为对象,建议作为对象'工具>引用>Microsoft脚本运行时
常量搜索\u术语为String=“TRAVEL”
Const SEARCH_TERM2为String=“BOOKS”
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”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=“&_
“桌面和客户端信息=亚马逊搜索ui&mid=ATVPDKIKX0DER&alias=aps&b2b=0&fresh=0&ks=76&”_
“prefix=“&SEARCH\u TERM&”&event=onKeyPress&limit=11&fb=1&suggestion type=KEYWORD&suggestion type=“&_
“小部件&u=1556820864750”,错误
.setRequestHeader“用户代理”、“Mozilla/5.0”
.发送
设置json=JsonConverter.ParseJson(.responseText)(“建议”)
以
对于json中的每个建议
调试。打印建议(“值”)
下一个
端接头

您可以在“网络”选项卡中找到一个API调用。它返回一个json字符串,您可以使用该字符串进行解析以获得建议。我使用jsonconverter.bas,下载后,我将其添加到项目中,然后转到VBE>工具>引用>添加对Microsoft脚本运行时的引用

url本身是一个查询字符串,即它由不同的参数构成。例如,有一个
limit
参数,其值为
11
,它指定要返回的建议数量。您可以更改和/或删除其中一些。下面,我将
SEARCH\u TERM
常量连接到查询字符串中,以表示您的搜索值(将在搜索框中键入的值)

我不知道是否有任何参数是基于时间的(即随着时间的推移而过期-自从您发布问题以来,我已经提出了许多没有问题的请求)。这可能是必要的基于时间的值可以通过事先获取亚马逊搜索页面的请求来提取

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:

选项显式
公共子GetTable()
Dim json作为对象,建议作为对象'工具>引用>Microsoft脚本运行时
常量搜索\u术语为String=“TRAVEL”
Const SEARCH_TERM2为String=“BOOKS”
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”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=“&_
“桌面和客户端信息=亚马逊搜索ui&mid=ATVPDKIKX0DER&alias=aps&b2b=0&fresh=0&ks=76&”_
“prefix=“&SEARCH\u TERM&”&event=onKeyPress&limit=11&fb=1&suggestion type=KEYWORD&suggestion type=“&_
“小部件&u=1556820864750”,错误
.setRequestHeader“用户代理”、“Mozilla/5.0”
.发送
设置json=JsonConverter.ParseJson(.responseText)(“建议”)
以
对于json中的每个建议
调试。打印建议(“值”)
下一个
端接头

QHarr-非常感谢您的快速回复。当我尝试执行您的代码时,我在“WriteTxtFile.responseText”行中得到了一个“Sub或Function not defined”。很抱歉,我忘了包含“Option Explicit”语句。
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