gpt4 book ai didi

javascript - 单击链接后让 Nightmare 等待下一页加载

转载 作者:太空宇宙 更新时间:2023-11-04 15:38:54 26 4
gpt4 key购买 nike

我正在使用 Nightmare.js 来抓取公共(public)记录,并且只是想让抓取工具等待下一页加载。我正在抓取搜索结果,然后按下一步按钮(显然)进入下一页。我无法使用 nightmare.wait(someConstTime) 准确等待下一页加载,因为有时 someConstTime 比加载下一页所需的时间短(尽管它总是低于 30 秒)。我也无法使用 nightmare.wait(selector) ,因为所有结果页面上始终存在相同的选择器。在这种情况下, Nightmare 基本上根本不会等待,因为选择器已经存在(在我已经抓取的页面上),因此它将继续多次抓取同一页面,除非新页面在下一个循环之前加载。

点击下一步按钮后,如何有条件地等待下一页加载?

如果我能弄清楚如何 - 我会将当前页面 (currentPageStatus) 的“显示 # 到 # of## 条目”指示器与最后一个已知值 (lastPageStatus)并等待它们不同(因此加载下一页)。

enter image description here(忽略示例图像只有一个搜索结果页)

我会使用 https://stackoverflow.com/a/36734481/3491991 中的代码来做到这一点但这需要将 lastPageStatus 传递到 deferredWait (我无法弄清楚)。

这是我到目前为止得到的代码:

// Load dependencies
//const { csvFormat } = require('d3-dsv');
const Nightmare = require('nightmare');
const fs = require('fs');
var vo = require('vo');

const START = 'http://propertytax.peoriacounty.org';
var parcelPrefixes = ["01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16","17","18","19"]

vo(main)(function(err, result) {
if (err) throw err;
});

function* main() {
var nightmare = Nightmare(),
currentPage = 0;
// Go to Peoria Tax Records Search
try {
yield nightmare
.goto(START)
.wait('input[name="property_key"]')
.insert('input[name="property_key"]', parcelPrefixes[0])
// Click search button (#btn btn-success)
.click('.btn.btn-success')
} catch(e) {
console.error(e)
}
// Get parcel numbers ten at a time
try {
yield nightmare
.wait('.sorting_1')
isLastPage = yield nightmare.visible('.paginate_button.next.disabled')
while (!isLastPage) {
console.log('The current page should be: ', currentPage); // Display page status
try {
const result = yield nightmare
.evaluate(() => {
return [...document.querySelectorAll('.sorting_1')]
.map(el => el.innerText);
})
// Save property numbers
// fs.appendFile('parcels.txt', result, (err) => {
// if (err) throw err;
// console.log('The "data to append" was appended to file!');
// });
} catch(e) {
console.error(e);
return undefined;
}
yield nightmare
// Click next page button
.click('.paginate_button.next')
// ************* THIS IS WHERE I NEED HELP *************** BEGIN
// Wait for next page to load before continue while loop
try {
const currentPageStatus = yield nightmare
.evaluate(() => {
return document.querySelector('.dataTables_info').innerText;
})
console.log(currentPageStatus);
} catch(e) {
console.error(e);
return undefined;
}
// ************* THIS IS WHERE I NEED HELP *************** END
currentPage++;
isLastPage = yield nightmare.visible('.paginate_button.next.disabled')
}
} catch(e) {
console.error(e)
}
yield nightmare.end();
}

最佳答案

我有一个类似的问题,但我设法解决了。基本上我必须导航到搜索页面,选择“每页 100”选项,然后等待刷新。唯一的问题是,手动等待时间是否允许 AJAX 触发并重新填充超过 10 个结果(默认)是一个冒险。

我最终这样做了:

nightmare
.goto(url)
.wait('input.button.primary')
.click('input.button.primary')
.wait('#searchresults')
.select('#resultsPerPage',"100")
.click('input.button.primary')
.wait('.searchresult:nth-child(11)')
.evaluate(function() {
...
}
.end()

有了这个,评估将不会触发,直到它检测到至少 11 个具有 .searchresult 类的 div。由于默认值为 10,因此必须等待重新加载才能完成。

您可以扩展此功能以从第一页中抓取可用结果的总数,以确保(就我而言)有超过 10 个可用结果。但这个概念的基础是有效的。

关于javascript - 单击链接后让 Nightmare 等待下一页加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44060214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com