puppeteer我用到的有两种爬取方法
第一种是根据页面选择器去爬取对应的数据 第二种是根据接口去爬取
一 、以Facebook的广告页页面数据为例,我需要拿到对应的数据
const puppeteer = require('puppeteer');
let URL = `https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=ALL&view_all_page_id=${
id}`
const browser = await puppeteer.launch({
headless: false});
const page = await browser.newPage();
await page.goto(URL,{
timeout: 30 * 1000,
waitUntil: [
'load', //等待 “load” 事件触发
'domcontentloaded', //等待 “domcontentloaded” 事件触发
'networkidle0', //在 500ms 内没有任何网络连接
'networkidle2' //在 500ms 内网络连接个数不超过 2 个
]
});
let Selector = '#content > div > div > div._7lcc > div._8n-_ > div._8n-x > div > div._9ccv > div:nth-child(2) > div._9cb_ > div'
try {
await page.click(Selector)
}
catch(err){
console.log('找不到!')
browser.close();
return false;
}
await autoScroll(page);
const result = await page.evaluate(() => {
let data = []; // 初始化空数组来存储数据
let elements = document.querySelectorAll('._99s5'); // 获取所有广告
for (var element of elements){
// 循环
let state = element.querySelector('._7jv-').innerText;
let castDate = element.querySelector('._9cd3').innerText;
let orderNumber = element.querySelector('._9cd3 div').innerText.split(':')[1];
let videoUrl = element.querySelector('._8o0a video') ==null ? element.querySelector('._7jys')==null ? 'https://images.zzsbx.com/upload/20201010/9522a4e5fa4e47108e9d40ed0ae0b6fd.png' :element.querySelector('._7jys').getAttribute('src') : element.querySelector('._8o0a video').getAttribute('src')
let orderUrl = element.querySelector('._231w') == null ? element.querySelector('._4ik4 div a')==null ? '': element.querySelector('._4ik4 div a').getAttribute('href') :element.querySelector('._231w').getAttribute('href')
let title = element.querySelector('._7jyr div ._4ik4 div') ==null ? ' ' : element.querySelector('._7jyr div ._4ik4 div').innerText;
let nums = element.querySelector('._9b9y span strong')== null ? '1' : element.querySelector('._9b9y span strong').innerText.split('条')[0];
let content = element.querySelector('._8jgz ._8jh1 ._8jh2 div ._4ik4') == null ? ' ' : element.querySelector('._8jgz ._8jh1 ._8jh2 div ._4ik4').innerText;
data.push({
state,castDate,orderNumber,videoUrl,orderUrl,title,nums,content}); // 存入数组
}
return data; // 返回数据
})
browser.close();
console.log('result',result)
return result;
第二种是根据数据接口去爬取
const puppeteer =