javascript - 单击每个元素然后用 horseman 抓取

标签 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 函数()

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 元素,这意味着数据是可见的并且能够被抓取。我在该做什么上遇到困难,所以任何帮助都会很棒!

最佳答案

以下代码:

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

...将无法工作,因为 .click() horseman Action 只针对单个元素。相反,您可以尝试使用以下适用于许多元素的代码:

    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 中添加表存在测试,但我想如果其他点击没有执行任何操作,您可以忽略它。

关于javascript - 单击每个元素然后用 horseman 抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34053292/

相关文章:

javascript - 在 javascript 中使用 jest 模拟 Azure Function 上下文上的不同日志级别

javascript - 在 react 中使用内联样式的正确方法是什么?

java - java/javascript 中浏览器选项卡的登录控件

mysql - 使用 mysql 和 nodeJS 构建一个 docker

javascript - 在 iframe 中的光标处插入 html

javascript - 如何在strongloop环回中使用mongoDB的提示运算符?

javascript - 计算 JavaScript/NodeJS/Underscore 中的哈希值

node.js - sequelize - 更新行而不改变 updated_at 字段

node.js - Sequelize .create 没有为我的模型生成内容

javascript - Node Webkit 使用哪个 nodeJS 版本?