使用 XMLHTTP 进行亚马逊 URL 抓取 - 亚马逊屏蔽?

问题描述 投票:0回答:1

因此,如果我使用浏览器浏览产品卖家列表,例如:

https://www.amazon.co.uk/gp/offer-listing/B076C6769Z/ref=dp_olp_new?ie=UTF8&condition=new

我看到了卖家名单。

但是,如果我使用 XMLHTTP 通过 VBA 构建相同的 URL,亚马逊会返回不同的页面(与产品无关的通用页面)。就好像他们怀疑我不是一个使用浏览器的人?

Dim XMLHTTP As Object, html As Object, objResult As Object
Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP")
url = "https://www.amazon.co.uk/gp/offer-listing/B002AVVO7K/ref=dp_olp_new? 
ie=UTF8&condition=new"
XMLHTTP.Open "GET", url, False
XMLHTTP.setRequestHeader "Content-Type", "text/xml"
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) 
Gecko/20100101 Firefox/25.0"
XMLHTTP.send
Set html = CreateObject("htmlfile")
html.body.innerHTML = XMLHTTP.responseText
Debug.Print XMLHTTP.responseText
xmlhttprequest screen-scraping
1个回答
0
投票

当使用 VBA 和 XMLHTTP 从 Amazon 抓取数据时,遇到 Amazon 返回不同页面的情况,这清楚地表明 Amazon 的服务器可以检测到自动化脚本。即使您设置了用户代理,亚马逊的高级检测机制通常需要更复杂的方法才能确信该请求不是自动化的。

这是 VBA 脚本的增强版本,其中包含可能有帮助的附加标头:

Dim XMLHTTP As Object, html As Object
Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP")

url = "https://www.amazon.co.uk/gp/offer-listing/B002AVVO7K/ref=dp_olp_new?ie=UTF8&condition=new"

XMLHTTP.Open "GET", url, False
XMLHTTP.setRequestHeader "Content-Type", "text/xml"
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"
XMLHTTP.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
XMLHTTP.setRequestHeader "Accept-Language", "en-US,en;q=0.5"
XMLHTTP.setRequestHeader "DNT", "1"
XMLHTTP.setRequestHeader "Connection", "keep-alive"
XMLHTTP.send

Set html = CreateObject("htmlfile")
html.body.innerHTML = XMLHTTP.responseText

Debug.Print XMLHTTP.responseText

在此脚本中,添加了“Accept”、“Accept-Language”和“DNT”(请勿跟踪)等附加标头,以使请求更接近地模仿常规 Web 浏览器。

如果您继续遇到直接抓取方法的困难,替代解决方案可以是使用像 Crawlbase 这样的网络抓取服务。 Crawlbase 旨在处理复杂的抓取任务,包括那些涉及具有先进反机器人措施的网站的任务。它可以管理 IP 轮换、标头管理和 JavaScript 渲染,这对于像 Amazon 这样具有挑战性的网站特别有用。请记住确保您的抓取行为遵守网站的服务条款和相关法律法规。

© www.soinside.com 2019 - 2024. All rights reserved.