使用casperjs从灯箱刮取文本

时间:2014-06-30 20:38:15

标签: javascript casperjs

我使用casperjs从网站上抓取文本,到目前为止它工作正常。但是,我从这个页面上搜集了数百个产品,其中一些产品旁边有一个橙色按钮。

橙色按钮的类别为button small orange。如果单击此橙色按钮,将打开一个带有产品描述的灯箱。

如果有橙色按钮,如果在那里点击描述,然后退出灯箱然后继续迭代100个产品,我将如何点击橙色按钮?

1 个答案:

答案 0 :(得分:2)

您需要确定每个步骤中涉及的元素。您可以使用Firefox或Chrome中的开发人员工具执行此操作。

你可以找到这样的元素数量:

var buttonNumber = casper.getElementsInfo(".button.small.orange").length;

然后以最大值为基础迭代按钮:

var x = require('casper').selectXPath
for(var i = 0; i < buttonNumber; i++) {
    casper.thenClick(x("(//*[contains(@class,'button') and contains(@class,'small') and contains(@class,'orange')])["+(i+1)+"]"));
    scheduleScrapeAndClose();
}

XPath表达式的//*[contains(@class,'button') and ...]部分基本上等同于.button.small.orange CSS选择器。它返回一个节点列表,之后的索引就是你迭代的按钮。喜欢:(//*[...])[1]

您唯一需要做的就是定义scheduleScrapeAndClose函数。它可能看起来像这样:

function scheduleScrapeAndClose(){
    casper.waitUntilVisible("your light box selector");
    casper.then(function(){
        // scrape the description
        var descr = this.fetchText("your description selector");
        this.click("your light box close selector");
    });
    casper.waitWhileVisible("again, your light box selector");
}

我假设每次点击按钮只有一个灯箱。

将它们放在一起它看起来像这样:

var x = require('casper').selectXPath,
    casper = require('casper').create();

function scheduleScrapeAndClose(){
    // stuff from above
}
casper.start(url);
casper.then(function(){
    var buttonNumber = casper.getElementsInfo(".button.small.orange").length;
    for(var i = 0; i < buttonNumber; i++) {
        casper.thenClick(x("(//*[contains(@class,'button') and contains(@class,'small') and contains(@class,'orange')])["+(i+1)+"]"));
        scheduleScrapeAndClose();
    }
});
casper.run(function(){this.exit();});