我有一個很大的地址陣列,我需要同時打開并獲得資料。 由于服務器的限制,我不能同時打開10個以上的標簽。 如何在serialNumbers.forEach中等到一個新的免費頁面出現? 我知道我可以檢查是否browser.pages() < 10.但是如何使回圈在一個空閑標簽的迭代中等待,而不進入下一個迭代?
const puppeteer = require('puppeteer') 。
let numberOfOpenPages;
let serialNumbers = ['FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1'/span>, 'FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1'/span>, 'FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1'/span>] 。
async function processArray(){
const browser = await puppeteer.launch({ headless: true })。)
serialNumbers.forEach(async (item, i) => {
//新頁面,然后獲得資料。
const page = await browser.newPage()。
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'/span>) 。
await page.goto(`https://support.apple.com/en_US/specs/${item}`) 。
await page.waitForSelector(' .article_link')。
await page.click('.article_link') 。
await page.waitForSelector('#article')。
const specs = await page.evaluation(() => {
let article = document.querySelector('h1').innerHTML。
return `${article}`。
});
console.log(specs)。
await page.close()。
//當所有的頁面被關閉時關閉瀏覽器。
numberOfOpenPages = (await browser.pages()).length。
console.log(numberOfOpenPages)。
if (numberOfOpenPages <= 1) {
await browser.close()。
}
})
}
processArray()
uj5u.com熱心網友回復:
也許像這樣?
也許像這樣?
const browser = await puppeteer.launch({ headless: true })。)
const serialNumbers = ['FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1'/span>, 'FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1'/span>, 'FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1'/span>] 。
const pageLimit = 10;
for (let i = 0; i < pageLimit; i ) {
processPage(await browser.newPage() )。
}
async function processPage(page) {
if (serialNumbers.length == 0) {
await page.close()。
if ((await browser.pages()).length <=1) await browser.close()。
return。
}
const serialNumber = serialNumbers.shift()。
await page.goto(`https://support.apple.com/en_US/specs/${serialNumber}`)。
//處理該頁面...
processPage(page)。
uj5u.com熱心網友回復:
我使用setTimeOut制作了它 但有時它在同一時間啟動的標簽比需要的多。但這個錯誤很小。
如果有更正確的解決方案,我將很高興知道
// const { copyFileSync } = require('fs) = require('fs');
const puppeteer = require('puppeteer'/span>)。
let numberOfOpenPages;
let i = 0;
let serialNumbers = ['FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1'/span>, 'FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1'/span>。'FVFDT2GCQ6L7'/span>, 'DLXFG3X2DFJ1', 'FVFDT2GCQ6L7', 'DLXFG3X2DFJ1', 'FVFDT2GCQ6L7'] 。
async function newPage(serial, browser) {
numberOfOpenPages = (await browser.pages()).length。
console.log(numberOfOpenPages)。
if (numberOfOpenPages < 10) {
//新頁面,然后獲得資料。
const page = await browser.newPage()。
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'/span>) 。
await page.goto(`https://support.apple.com/en_US/specs/${serialNumbers[serial]}`) 。
await page.waitForSelector(' .article_link')。
await page.click('.article_link') 。
await page.waitForSelector('#article')。
const specs = await page.evaluation(() => {
let article = document.querySelector('h1').innerHTML。
return `${article}`。
});
console.log(specs)。
await page.close()。
//當所有的頁面被關閉時關閉瀏覽器。
numberOfOpenPages = (await browser.pages()).length。
// console.log(numberOfOpenPages);
// if (numberOfOpenPages <= 1) {
// await browser.close();
// console.log('браузер закрыт!')
// }
} else {
setTimeout(() => {
newPage(serial, browser)。
}, 3000); // не ставить меньше 1 сек чтобы не совпадало сразу в один свободный слот /span>
}
}
async function processArray(){
const browser = await puppeteer. launch({ args: ['--no-sandbox', '-disable-setuid-sandbox'], headless: true })。)
//設定你的計數器為1。
function myLoop () { //創建一個回圈函式。
setTimeout(function () { //在回圈被呼叫時呼叫一個3s的setTimeout 。
console.log('запускаем', i) 。
newPage(i, browser); //你的代碼在這里。
i ; //增加計數器。
if (i < serialNumbers.length) { // if the counter < 10, call the loop function
myLoop(); /...再次觸發另一個。
} else console.log('end loop'); //... setTimeout()
}, 500)
}
myLoop()。
}
processArray()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/314851.html
標籤:
