亚马逊卖家中心登录Scrape PhantomJS + CasperJS

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

首先我想说的是,我们只抓取自己的账户,因为我的公司需要来自我们自己的仪表板的数据,而我们无法从 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。它仍然得到验证码。

php amazon-web-services web-scraping phantomjs casperjs
2个回答
0
投票

由于抓取/自动化经常发生这种情况,错误的原因不一定是错误编写的脚本,还包括上下文、底层基础设施。

在这种情况下,我们(在评论中)确定脚本仅在从特定服务器运行时才会受到验证码的挑战,该服务器的 IP 地址似乎已放入不受信任的列表中。


0
投票

考虑到您在亚马逊卖家中心的情况,听起来验证码是对您的抓取模式中某些内容的响应。 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。它旨在处理复杂的抓取任务,具有旋转代理和高级检测避免机制等功能。这可以简化您的抓取需求,特别是对于像亚马逊卖家中心这样具有挑战性的网站。使用此类工具时请务必遵守亚马逊的条款和规定。

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