我注意到一个问题。如果我复制带有搜索结果的 Amazon URL,而具有其他 IP 的人打开它,那么结果可能会有所不同。 例如: https://www.amazon.com/s/ref=sr_nr_p_36_0?lo=toys-and-games&rh=n%3A165793011%2Cp_72%3A1248964011&sort=price-desc-rank&low-price=34.99&high-price=34.99
如果您从达拉斯 IP 打开此 URL,您将获得 102 页结果。
如果你用 Honolulu IP 打开它,你会得到 101 页。
如果你从俄罗斯 IP 打开它,你会得到 93 页。
是否可以在 url 中指定用于运送的美国邮政编码,以便它为每个 IP 地址显示相同的结果?
我注意到的另一个小问题——它为不同的人显示不同的页面布局。有时它是默认的蓝色链接,有时它有银色按钮。也许有人知道如何使用 url 参数将设计锁定到一个布局? :)
没有简单的解决方案,所以这是我的复杂方法。
想法是:您必须发送与在浏览器中手动更改 ZIP 时发送的请求相同的请求。然后您的邮政编码将在您的会话中被记住。
这是我在 PHP 中使用 GuzzleHttp 客户端的解决方案:
$jar = new \GuzzleHttp\Cookie\CookieJar();
$client = new \GuzzleHttp\Client([
'headers' => [
'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'accept-language' => 'en;q=0.8',
'user-agent' => '', //set some User-Agent or just leave it empty cos it works too
'x-requested-with' => 'XMLHttpRequest'
],
'cookies' => $jar,
]);
try {
$client->post('https://www.amazon.com/gp/delivery/ajax/address-change.html', [
'form_params' => [
'locationType' => 'LOCATION_INPUT',
'zipCode' => '11219', //YOUR ZIP HERE
'storeContext' => 'office-products',
'deviceType' => 'web',
'pageType' => 'Detail',
'actionSource' => 'glow',
]
]);
} catch (RequestException $e) {
echo "Failed to set ZIP";
}
$response = $client->get('...'); //get any other page from Amazon, now it will have proper ZIP
我正在使用很棒的 Guzzle 功能 -
cookies
容器:http://docs.guzzlephp.org/en/stable/request-options.html#cookies
它可以像浏览器一样记住和处理请求之间的 cookie。
在所有进一步的请求中,您应该继续使用这些 cookie,它会为您返回 ZIP 的结果。
当然您可以手动处理 cookie,Guzzle 不是必需的,但可以使事情变得更简单。