首先我想说的是,我们只抓取自己的账户,因为我的公司需要来自我们自己的仪表板的数据,而我们无法从 MWS API 获取这些数据。我非常熟悉这些 API。
多年来我一直在使用登录/抓取脚本。但最近亚马逊开始提供验证码。我以前的抓取方式是通过 PHP 发出 cURL 请求来模仿浏览器。
我的新方法是使用 PhantomJS 和 CasperJS 来达到相同的效果。一天一切正常,但我又收到验证码了。
现在,我碰巧从内部消息来源得知亚马逊没有进行任何刮擦检测。然而,他们确实进行黑客/DDOS 攻击检测。所以我认为这个 casperJS 代码的某些内容被标记为攻击。
我认为我调用脚本的频率并不高。我已经更改了请求来源的 IP 地址。
这是一些 casperJS 代码
var fs = require('fs');
var casper = require('casper').create({
pageSettings: {
loadImages: false,
loadPlugins: false,
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36'
}
});
// use any cookies
var cookieFilename = "cookies/_cookies.txt";
var data = fs.read(cookieFilename);
if(data) {
phantom.cookies = JSON.parse(data);
}
//First step is to open Amazon
casper.start("https://sellercentral.amazon.com/gp/homepage.html", function() {
console.log("Amazon website opened");
});
casper.wait(1000, function() {
if(this.exists("form[name=signinWidget]")) {
console.log("need to login");
//Now we have to populate username and password, and submit the form
casper.wait(1000, function(){
console.log("Login using username and password");
this.evaluate(function(){
document.getElementById("username").value="*****";
document.getElementById("password").value="*****";
document.querySelector("form[name=signinWidget]").submit();
});
});
// write the cookies
casper.wait(1000, function() {
var cookies = JSON.stringify(phantom.cookies);
fs.write(cookieFilename, cookies, 644);
})
} else {
console.log("already logged in");
}
});
//Wait to be redirected to the Home page, and then make a screenshot
casper.wait(1000, function(){
console.log("is login found?");
console.log(this.exists("form[name=signinWidget]"));
this.echo(this.getPageContent());
});
casper.run();
最后一行的结果只是一个带有验证码的登录页面。是什么赋予了?这应该是一个普通的浏览器。当我在计算机上使用相同的登录名时,我完全没有遇到任何问题。
我还尝试了几种不同的用户代理字符串。有时会临时更改这些作品。
此外,当我在本地加载所有这些时,它工作正常。但在linux服务器上它得到的是验证码。请注意,我已经多次更改远程 Linux 服务器上的 IP。它仍然得到验证码。
由于抓取/自动化经常发生这种情况,错误的原因不一定是错误编写的脚本,还包括上下文、底层基础设施。
在这种情况下,我们(在评论中)确定脚本仅在从特定服务器运行时才会受到验证码的挑战,该服务器的 IP 地址似乎已放入不受信任的列表中。
考虑到您在亚马逊卖家中心的情况,听起来验证码是对您的抓取模式中某些内容的响应。 PhantomJS 和 CasperJS 虽然功能强大,但有时可以被亚马逊等复杂网站检测到。
您可能需要考虑在脚本中加入更多类似人类的交互。这可能包括操作之间的随机延迟、更多样的导航模式,甚至模拟鼠标移动。此类调整可能会使您的抓取活动不易被检测到。
这是一个包含更多类似人类行为的简化示例:
var casper = require('casper').create();
function randomDelay(min, max) {
return Math.round(Math.random() * (max - min) + min);
}
casper.start('https://sellercentral.amazon.com/', function() {
this.wait(randomDelay(1000, 3000), function() {
// Your login process
});
});
// Add more steps with random delays in between
// ...
casper.run();
在此片段中,
'randomDelay'
引入了等待时间的可变性,使行为更难以预测且更人性化。
如果您正在寻找更简化的解决方案,您可能需要查看 Crawlbase。它旨在处理复杂的抓取任务,具有旋转代理和高级检测避免机制等功能。这可以简化您的抓取需求,特别是对于像亚马逊卖家中心这样具有挑战性的网站。使用此类工具时请务必遵守亚马逊的条款和规定。