如何在puppeteer网络抓取中管理会话数据



我正试图使用puppeteer从这个网站上删除数据。我认为需要保留会话数据来浏览网站上的不同页面。以下是我的代码,有时一些页面没有加载,并且检测到我的请求是机器人请求。

请参阅代码,并在使用puppeteer进行网络抓取时帮助我进行会话管理。

const puppeteer = require('puppeteer-extra')
const storage = require('node-persist');
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())
const cheerio = require('cheerio')
const pretty = require("pretty");

puppeteer.launch({
headless: false,
args: ["--disable-setuid-sandbox"],
'ignoreHTTPSErrors': true,
executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
userDataDir: '/Users/username/Library/Application Support/Google/Chrome/Default'
}).then(async browser => {
const page = await browser.newPage()
const baseURL = 'https://www.immobilienscout24.de'
for(var p=1; p <= 10;  p++) {

await page.goto("https://www.immobilienscout24.de/Suche/de/neubauwohnung-mieten?pagenumber="+p,{
waitUntil: "load"
})
const client = await page.target().createCDPSession();
const cookies = (await client.send('Network.getAllCookies')).cookies;
await page.setCookie(...cookies);
const localStorage = await page.evaluate(() => Object.assign({}, window.localStorage))
const html = await page.content();
const $ = cheerio.load(html);
const tiles = $('.result-list__listing');

tiles.map( async (i, item)   =>  {
let link = $(item).find('a.result-list-entry__brand-title-container').attr('href');
if (link.includes("expose")) {
link = baseURL+link
}
console.log(link)
});
await page.waitForTimeout(10000)
}
await browser.close()
})

您同时发出10个请求,因为您使用的是传统的循环:

for(var p=1; p <= 10;  p++)

因此,该网站适当地设置了速率限制以防止ddos攻击,这就是为什么你被检测为机器人的原因。

使用ES6,您可以请求10次,但顺序如下:

for (let p of [...Array(10).keys()] ){
// execute your request here
}

希望它能有所帮助!

最新更新