我正在为动态网页编写页面抓取工具。页面具有初始加载,然后在短加载时间后加载剩余的内容。
我已经考虑了负载,并且已经成功从页面中删除了HTML,但该页面并未立即加载所有内容。相反,它通过GET请求URL加载指定数量的内容,然后有一个"获取更多"页面上的按钮。我的目标是点击这个" Get More"按钮,直到所有内容都加载到页面上。对于那些想知道的人,我不希望通过GET URL一次性加载所有内容,因为它们对服务器有影响。
我很难形成循环或迭代,这样我就可以反复点击页面。
const NIGHTMARE = require("nightmare");
const BETHESDA = NIGHTMARE({ show: true });
BETHESDA
// Open the bethesda web page. Web page will contain 20 mods to start.
.goto("https://bethesda.net/en/mods/skyrim?number_results=40&order=desc&page=1&platform=XB1&product=skyrim&sort=published&text=")
// Bethesda website serves all requested mods at once. Each mod has the class "tile". Wait for any tile class to appear, then proceed.
.wait(".tile");
let additionalModsPresent = true;
while(additionalModsPresent) {
setTimeout(function() {
BETHESDA
.wait('div[data-is="main-mods-pager"] > button')
.click('div[data-is="main-mods-pager"] > button')
}, 10000)
additionalModsPresent = false;
}
// let moreModsBtn = document.querySelector('div[data-is="main-mods-pager"] > button');
// .end()
BETHESDA.catch(function (error) {
console.error('Search failed:', error);
});

到目前为止,我的想法是使用while循环,尝试在一段时间后单击按钮。如果发生错误,可能是因为该按钮不存在。我遇到的问题是,我似乎无法在setTimeout或setInterval内部进行点击。我相信存在某种范围问题,但我不知道到底发生了什么。
如果我可以让click方法在setInterval或类似的东西中运行,问题就会解决。
思想?
答案 0 :(得分:1)
您可以参考问题(循环中运行噩梦的问题)[https://github.com/segmentio/nightmare/issues/522]
我使用给定的指南修改了代码。它似乎工作正常
const NIGHTMARE = require("nightmare");
const BETHESDA = NIGHTMARE({
show: true
});
BETHESDA
// Open the bethesda web page. Web page will contain 20 mods to start.
.goto("https://bethesda.net/en/mods/skyrim?number_results=40&order=desc&page=1&platform=XB1&product=skyrim&sort=published&text=")
// Bethesda website serves all requested mods at once. Each mod has the class "tile". Wait for any tile class to appear, then proceed.
.wait(".tile");
next();
function next() {
BETHESDA.wait('div[data-is="main-mods-pager"] > button')
.click('div[data-is="main-mods-pager"] > button')
.then(function() {
console.log("click done");
next();
})
.catch(function(err) {
console.log(err);
console.log("All done.");
});
}
最终,它应该在wait()的按钮上超时,然后你可以处理catch()块中的错误。要小心它继续下去:)我没有等到最后(你的内存可能会耗尽)。