我正在从Facebook Marketplace抓取数据。我想做的是使用puppeteer来:1)创建我所有列表名称的节点列表2)使用for循环单击列表名称以弹出更多信息3)从弹出窗口中刮取数据并将其保存到数组中4)关闭弹出窗口5)对每个列表重复此过程以返回数组数据
这是我目前无法使用的代码:
const postClick = async (page) => {
await page.evaluate(() => {
//Capture the nodelist of listing names
let buttons = document.querySelectorAll('#marketplace-modal-dialog-title');
//If the nodelist of listings exist
if(buttons.length) {
//Loop through all listing names
for(let i = 0; i < buttons.length; i++) {
let button = buttons[i];
//click the listing
button.click();
//wait for the X button to appear
async (page) => {
await page.waitForSelector("button._3-9a._50zy._50-1._50z_._5upp._42ft");
await page.waitFor(5000)
await page.evaluate(() =>{
//click the X button
document.querySelector('button._3-9a._50zy._50-1._50z_._5upp._42ft').click();
});
}
}
}
});
}
然后我在浏览器关闭此处之前立即致电:
await postClick(page);
我没有收到错误,但代码未运行。一旦我取出for循环,并让button = button [0];该代码仅适用于第一项。
#marketplace-modal-dialog-title
通过id捕获元素建议页面中仅存在1个项目,因为id应该是唯一的...我不知道为什么脸书有多个具有相同id的元素,但也许木偶对此做出了反应,仅捕获了1个元素
尝试按类别捕获按钮
let buttons = await page.$$('._50f4._50f7');
或与此等价的document.querySelectorAll
等价物>
也buttons.length
返回的数字是if(buttons.length)
,即您要检查的是true
还是false
,而不是数字,因此它应该是if(buttons.length > 0)
,尽管某些语言认为0
为假,但这有效,但不能一个好主意