我正在使用一个名为 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/