点击每个元素然后用骑士抓

时间:2015-12-02 21:25:11

标签: javascript node.js

我正在使用名为horseman的node.js模块从包含JavaScript的网站中删除一些数据。我无法弄清楚如何点击每个span元素,如果它包含一个元素,在这种情况下是表格。这将扩展该元素并生成可用于刮擦的数据,这些数据现在被隐藏。

我现在拥有什么

horseman
    .open(url)
    .click("span.title")
    .waitforSelector("span.title")
    .then(scrape)

刮擦功能:

function scrape() {

    return new Promise(function (resolve, reject) {

        return getLinks()
            .then(function (newLinks) {

                links = links.concat(newLinks);


                if (links.length < 1)
                    return horseman

                        .then(scrape);

            }
            })
        .then(resolve);
});
    }

getlinks function()

var links = [];

function getLinks() {

    return horseman.evaluate(function () {
        var links = [];
        $("span.title").each(function (item) {
            var link = {
                title: $(this).text()
            };
            links.push(link);
        });
        return links;
    });
}

我最初的想法是,在getLinks()函数中,我可以检查项是否包含表然后单击然后刮,但不知道如何实现它。 我们的想法是扩展所有尚未扩展的span元素,这意味着数据是可见的并且能够被抓取。我已经打了一堵砖墙,所以任何帮助都会很棒!

1 个答案:

答案 0 :(得分:2)

以下代码:

    horseman
        .open(url)
        .click("span.title")
        .waitforSelector("span.title")
        .then(scrape)

...不起作用,因为.click()骑士行动只解决单个元素。相反,您可以尝试以下适用于许多元素的代码:

    horseman
        .open(url)
        .evaluate(clickItems)
        .waitforSelector("span.title XXX")
        .then(scrape)

其中:

  • XXX应该是span.title内容的选择器(所以waitForSelector实际上会等待)。例如,让我们考虑一下这个标记:

    <span class="title"><!-- this is the clickable item --> <table>...</table> <div class="show-on-click">Blah blah</div> </span>

在上面的示例中,您将使用.waitForSelector('span.item .show-on-click')。在数据出现之前,您必须找到哪个选择器不存在。 (或使用.wait(1000)代替)

  • clickItem函数定义如下(我看到你使用jQuery所以我也会这样做)

    function clickItems() {
        var $items = $('span.title:has(table)');
    
        $items.each(function(index, $item) {
            $item.click();
        });
    }
    

注意:这将点击所有元素span.title。您可以修改click元素以在每个$item中添加表存在测试,但我想如果其他点击不执行任何操作,您可以省略它。