我无法正确处理回调/计时器,因此请继续执行以下操作。
我想收集网页上的所有链接/ URL,但是网页具有其中一项功能,当您滚动到页面底部时,该功能会加载更多内容,直到不再显示/加载为止。我可以使用.scrollIntoView()
在Javascript中实现此目标以下代码用于确定我是否已经到达页面末尾并且没有更多结果可加载。
var element = document.getElementById('browse_end_of_results_footer');
if (typeof(element) != 'undefined' && element != null) {
console.log('end');
} else {
console.log('scroll');
document.getElementById("pagelet_dock").scrollIntoView();
}
但是,我需要一直以1秒的延迟循环播放,直到达到终点或尝试了多次尝试,这样它就不会永远运行,但是我还需要它来收集其中的链接/ URL循环,当满足任一条件(最大尝试次数/结束次数)时,返回结果。
以下是我通过一起破解一些示例代码而设法获得的结果,但是正如我最初指出的那样,我无法理解Javascript回调和计时器。
var myVar = setInterval(myTimer, 1000);
function myTimer() {
var i = 0;
var d = new Date();
var t = d.toLocaleTimeString();
console.log(t)
i++;
var element = document.getElementById('browse_end_of_results_footer');
if (typeof(element) != 'undefined' && element != null) {
console.log('end');
myStopFunction();
} else {
console.log('scroll');
document.getElementById("pagelet_dock").scrollIntoView();
}
}
function myStopFunction() {
clearInterval(myVar);
}
编辑:设法使以下代码起作用,但是任何人都推荐一种更好的方法。
const sleep = (milliseconds) => {
return new Promise(resolve => setTimeout(resolve, milliseconds))
}
const pageDown = async () => {
var element = document.getElementById('browse_end_of_results_footer');
if (element) {
console.log('Reached Bottom');
return true;
}
console.log('Scrolling');
document.getElementById("pagelet_dock").scrollIntoView();
return false;
}
var maxAttempts = 5;
var items =[];
var bottom = false;
var attemptCounter = 0;
while (!bottom && attemptCounter < maxAttempts ) {
attemptCounter++;
bottom = await pageDown();
x = document.querySelectorAll('div[data-bt*="rank"]');
for (var i = items.length; i < x.length; i++) {
var jsonString = x[i].getAttribute('data-bt');
var data = JSON.parse(jsonString);
items.push(data.id);
}
await sleep(1000);
}
console.log(items);