Puppeteer爬虫脚本中使用 jQuery 的方法

1,552 阅读1分钟

利用 Puppeteer 操作无头浏览器进行数据爬取的时候,如果需要获取的dom节点较少,原生js选择器就完全够用

当需要获取的元素较多的时候,我就希望使用操作DOM效率最高的jq来完成操作

如果访问的网站,原生引用了jq

如果 targetPage 已经引入了jQuery 则可以直接用 $ 操作DOM结构,方法是声明一个变量

const userEl = await page.evaluate(() => {
let arr=[]
    var $ = window.$
      $('ul[class=user-list]').find('li').each((index,item)=>{
           arr.push($(item).find('img').attr('src'))
           console.log($(item).find('img').attr('src'))
      })
      return arr
    })

另外我发现有一些网站即使已经引用了jQuery 也无法 使用 window.获取获取 方法

如果没有引入可以自行插入 jQuery 方便接下来的DOM操作

await page
    .mainFrame()
    .addScriptTag({
      url: 'https://cdn.bootcss.com/jquery/3.2.0/jquery.min.js'
    })
  const userEl = await page.evaluate(() => {
  let arr=[]
      $('ul[class=user-list]').find('li').each((index,item)=>{
           arr.push($(item).find('img').attr('src'))
           console.log($(item).find('img').attr('src'))
      })
      return arr
    })  

或者使用三方工具

const puppeteer = require('puppeteer');
const $jquery = require("puppeteer-jquery");
const {pageExtend, PageEx} = $jquery;

(async __=>{
    let browser = await puppeteer.launch({headless: false});
    let pageOrg = await browser.newPage();
    //重点
    let page = pageExtend(pageOrg);
    
    await page.jQuery('body').append(`<h1>Title</h1>`);
    
    let title = await page.jQuery('h1').text();
   
    let text = await page.jQuery('body button:last')
        .closest('div')
        .find('h3')
        .css('color', 'yellow')
        .parent()
        .find(':last')
        .text()
    ;
})()