puppeteer 爬虫初探

在这里插入图片描述

1. puppeteer 和 puppeteer-core
安装 puppeteer 会默认下载一个最新版本的 chrome 浏览器;
安装 puppeteer-core ,不会安装 chrome, 若要程序打开浏览器运行时,需手动指定电脑系统安装的 chrome 浏览器路径

2. puppeteer-core 指定系统 chrome 浏览器路径

import puppeteer from 'puppeteer-core';
// launch 添加 executablePath 参数
await puppeteer.launch({executablePath: '/path/to/Chrome'});

查看本机 chrome路径: 在 chrome 浏览器中输入地址 chrome://version
在这里插入图片描述
3. 简单启用示例

const userAgents = [
  // 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
  // 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
  // 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36 QIHU 360SE',
  // 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
  // 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
];

// 随机选择一个 User-Agent
function getRandomUserAgent () {
  return userAgents[Math.floor(Math.random() * userAgents.length)];
}


(async () => {
  // Launch the browser and open a new blank page
  const browser = await puppeteer.launch({
    userDataDir: './userData', // 指定存放用户数据目录
    headless: false, // 关闭无头模式,会打开 chrome 浏览器
    args: [
      '--start-maximized', // 窗口最大化
      // `--proxy-server=${proxySettings.proxy}`, // 配置代理
      '--no-sandbox',
      '--disable-setuid-sandbox'
    ], 
    defaultViewport: { // 模式页面视图大小
      width: 1920,
      height: 1080,
    },
    devtools: true, // 打开开发者工具
  });

  try {

    let isLogin = false
    
    const page = await browser.newPage()
    
    // 设置随机 User-Agent
    const userAgent = getRandomUserAgent();
    await page.setUserAgent(userAgent);


    // 从文件读取 cookies
    const cookiesJson = fs.readFileSync('qcccookies.json', 'utf8');
    if (cookiesJson) {
      const cookies = JSON.parse(cookiesJson);
      // 在页面加载之前设置 cookies
      cookies && await page.setCookie(...cookies); // 使用扩展运算符展开 cookies 数组

    }



    // 进入目标页
    await page.goto('https://www.baidu.com', {
      waitUntil: "networkidle2",
    })

    // 判断是否有账户头像,有则说明自动登录成功
    const userImg = await page.$('xxxxx.img')
    if (userImg) {
      isLogin = true;
    }

    /**
     * 登录 在页面 input 中数据内容并登录
     */
    if (!isLogin) {
      // insert name
      await page.type('body > input', config.account, { delay: typeDelay });
      // insert pwd
      await page.type('body > input', config.pwd, { delay: typeDelay });
      // 点击登录
      await page.click('body >  button')
      // 页面截图
      await page.screenshot({ path: "test2.png" })
      
      // 等待进行手动登录验证,进入页面
      await page.waitForNavigation({
         waitUntil: 'load'
      })


      // 获取当前页面的所有 cookies
      {
        const cookies = await page.cookies();
        console.log(cookies);
        // 将 cookies 转换为 JSON 字符串并保存到文件
        await fs.writeFileSync('qcccookies.json', JSON.stringify(cookies, null, 2));
      }
    }

	// 获取打开的页面栈
    const pages = await browser.pages();
    console.log(pages);

    // 获取最新打开的页面
    let newPage = null
    await new Promise((resolve) => {
      browser.on('targetcreated', async (target) => {
        if (target.opener() === page.target()) {
          newPage = await target.page();
        }
      });
    });

    if (newPage) {
      await sleep(3000)
      await newPage.waitForSelector('body'); // 例如等待页面加载完成
      // 页面存 pdf
      await page.pdf({
          path: 'xxxx.pdf',
          format: 'A3',
          // displayHeaderFooter: true,
          margin: {
            top: '5mm',
            right: '5mm',
            bottom: '5mm',
            left: '5mm'
          }
      })
    }


  } catch (e) {
    console.error(e)
  } finally {
    // await browser.close()
  }

})();

4. 获取 dom 中的数据

  // 在页面内执行 document.querySelector。
  page.$(selector)
  
  // 在页面内执行 document.querySelectorAll。
  page.$$(selector)

  // page.$
  // page.$$
  //  page.evaluate
  const pageData = await page.evaluate(() => {
    // 获取节点容器
    const items = Array.from(document.querySelectorAll('#id li'));
    // 获取dom 文字信息
    return items.map(item => {
      return (
        {
          title: item.querySelector('.xxx a').innerText.replaceAll('/', '//'),
        }
      )
    });
  });

5. 简易反反爬虫

1. 动态设置 user-agent 
page.setUserAgent(userAgent);
2. 读取 cookie 和设置 cookie
const cookies = await page.cookies()
await page.setCookie(...cookies)
3. 开启存储用户数据,登录一次,未过期时间内,下次自动登录
const browser = await puppeteer.launch({
  userDataDir: './userData',
})

相关推荐

  1. 基于 Node.js 的爬虫Puppeteer

    2024-07-11 18:18:03       26 阅读
  2. puppyteer

    2024-07-11 18:18:03       31 阅读
  3. Puppeteer用途

    2024-07-11 18:18:03       28 阅读
  4. 初级爬虫实战——巴黎圣母院新闻

    2024-07-11 18:18:03       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 18:18:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 18:18:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 18:18:03       57 阅读
  4. Python语言-面向对象

    2024-07-11 18:18:03       68 阅读

热门阅读

  1. 3133. 数组最后一个元素的最小值

    2024-07-11 18:18:03       22 阅读
  2. windows脚本获取 svn版本号

    2024-07-11 18:18:03       19 阅读
  3. 力扣题解(摆动序列)

    2024-07-11 18:18:03       21 阅读
  4. 搭建discuz论坛(lvs+nginx+http+mysql+nfs)8台服务器

    2024-07-11 18:18:03       18 阅读
  5. 【AI大模型】如何在企业环境中部署GPT-3/GPT-4模型

    2024-07-11 18:18:03       22 阅读
  6. 图论学习 c++Ford-Fulkerson 方法

    2024-07-11 18:18:03       19 阅读
  7. 主线程结束子线程不再执行

    2024-07-11 18:18:03       23 阅读
  8. 手写函数柯里化示例

    2024-07-11 18:18:03       18 阅读
  9. 常微分方程的离散化

    2024-07-11 18:18:03       23 阅读
  10. Linux下解压.tar.gz文件

    2024-07-11 18:18:03       17 阅读
  11. 利用nodejs实现简单的静态文件托管

    2024-07-11 18:18:03       15 阅读