簡體   English   中英

在新標簽頁中打開鏈接,將 go 刮到上一頁

[英]Open a link in a new tab, scrape, go to previous page

我正在使用 puppeteer 進行以下操作:

我切換await link.click(".ExCategory-results >.ExResult-row:nth-child(${i}) >.ExResult-cell >.ExHeading > a",); 對於await new.page('...')但它說它找不到a

這是我正在抓取的頁面,但請注意頁面底部的加載更多按鈕。

https://www.bodybuilding.com/exercises/finder

為了防止重置加載更多按鈕,我想在新選項卡中打開每個新按鈕,刮擦,關閉選項卡和 go 到下一個名稱。

如何在新選項卡中打開每個鏈接,關閉,然后 go 到上一個選項卡?

我的代碼:

var buttonExists = true;
let allData = [];
while (buttonExists == true) {
// const loadMore = true;
const rowsCounts = await page.$$eval(
    '.ExCategory-results > .ExResult-row',
    (rows) => rows.length
);
console.log(`row counts = ${rowsCounts}`);

for (let i = 2; i < rowsCounts + 1; i++) {
    const exerciseName = await page.$eval(
        `.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExHeading > a`,
        (el) => el.innerText
    );
    console.log(`Exercise = ${exerciseName}`);

    await link.click(`.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExHeading > a`,);
    await page.waitForSelector('#js-ex-content');

      ... fancy code here

    await page.goBack();

    let obj = {
        exercise: exerciseName,
    };

    allData.push(obj);

}
// clicking load more button and waiting 1sec
try {
    await page.click(LoadMoreButton);
}
catch (err) {
    buttonExists = false;
}
await page.waitForTimeout(1000);
}

這個選擇器: .ExCategory-results >.ExResult-row:nth-child(${i}) >.ExResult-cell >.ExHeading > a不必要地長,它給你的結果並不完全正確。

要獲得這些元素:

在此處輸入圖像描述

這個選擇器應該足夠了: .ExResult-row.ExHeading > a

然后你問:

我想在新選項卡中打開每個新選項卡、刮擦、關閉選項卡和 go 到下一個名稱。

如何在新選項卡中打開每個鏈接,關閉,然后 go 到上一個選項卡?

在 Puppeteer 中,您可以像這樣創建一個新頁面: await browser.newPage(); ,因此您可以多次執行並將頁面存儲到數組中:

let pages = [];
pages.push(await browser.newPage());

然后你得到鏈接:

const links = await pages[0].$$eval(
    '.ExResult-row .ExHeading > a',
    links => links.map(l => l.getAttribute('href'))
);

最后為每個鏈接創建一個新頁面,抓取您需要的內容,然后關閉頁面:

for (let link of links) {
    pages.push(await browser.newPage());
    await pages[pages.length - 1].goto(`${baseUrl}/${link}`);

    // your scraping

    await pages[pages.length - 1].close();
}

如果您需要查找更多內容,請參閱 Puppeteer 提供的API 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM