仅在检测到更改时刮擦?

时间:2015-02-10 17:57:20

标签: javascript phantomjs screen-scraping casperjs

我的银行有一个非常简单的登录系统。使用casperjs我已经能够提取我的最新账户余额和我的最后一笔交易。有很多方法可以从互联网上删除数据,我只是使用Casperjs来测试它的功能。我和银行核对过他们说 - 只要它是我的银行帐户,就没问题了。

以下是我必须处理的技术问题:银行将登录次数限制为每天约40次。登录次数是否应该高于该次数。它将锁定我的帐户6小时。 (此外,系统每20分钟登出一次 - 与行动无关)

我想要弄清楚的是: 如果交易已经发生并且账户余额发生变化,有没有办法只运行抓取功能?

刮擦通常是为了简单起见而及时进行的。我可以实现什么是推送通知风格的抓取机制?

目标是获取消息/电子邮件每次发生交易(最多延迟3-4分钟),同时不会被锁定在系统之外。

任何有创意的答案都会有。

1 个答案:

答案 0 :(得分:2)

如果没有登录,您怎么知道交易已经发生?如果网上银行网站编程良好,您将必须登录。

小算术:

  • 每24小时登录40次
  • 20分钟后退出
  • 导致每24小时/ 39~37分钟登录而不会有锁定风险
  • 这意味着您最多延迟17分钟(如果没有新信息,这太过分了)

你显然整个24小时都没有醒来。

  • 每16小时登录40次
  • 20分钟后退出
  • 导致每16小时/ 39~24.6分钟登录而不会有锁定风险
  • 这意味着你有最多5分钟的延迟(这似乎是可以接受的)

与您的银行联系,他们是否提供API。如果您的帐户被锁定,他们可能会对您的活动产生怀疑并永久锁定您的帐户。

由于CasperJS是异步的,你必须递归使用你的抓取功能。

var casper = require("casper").create(),
    url = "your bank url",
    counter = 0;

function login(){
    counter++;
    this.thenOpen(url, function(){
        this.fillSelectors("login form selector", {
            "username selector": "username",
            "password selector": "password",
            // more if necessary
        }, true); // automatically submit
    });
}

function scrape(){
    // do your thing
}

function run(){
    if (counter == 39) {
        counter = 0;
        this.wait(8 * 60 * 60 * 1000)
            .then(run);
    } else if (this.exists("selector which shows that you are logged in")) {
        this.then(scrape)
            .wait(30 * 1000)
            .then(run);
    } else if (this.exists("selector which shows that you where automatically logged out")) {
        this.wait(5 * 60 * 1000)
            .then(login)
            .then(run);
    } else {
        this.then(login)
            .then(run);
    }
}

casper.start().then(run).run();