全栈直通车-王世彪的博客
关注公众号
  • 开发桌面程序
  • javascript教程
  • css样式
  • vuejs
  • 部署免费CDN
  • SEO搜索引擎优化
  • vuepress教程
  • redis分布式缓存
  • Golang
  • PHP
  • Python
  • Java
  • NodeJs
  • tomcat
  • ELK
  • Mysql数据库
  • Nosql数据库
  • C/C++底层开发
  • 音视频/流媒体
  • linux服务器
  • nginx服务器
  • 容器技术
  • 负载均衡
  • 项目管理
  • 持续集成
  • 大数据
  • 微信公众号运营
  • markdown用法
赞一个
友链
联系作者

王世彪

努力做个影响他人滴人
关注公众号
  • 开发桌面程序
  • javascript教程
  • css样式
  • vuejs
  • 部署免费CDN
  • SEO搜索引擎优化
  • vuepress教程
  • redis分布式缓存
  • Golang
  • PHP
  • Python
  • Java
  • NodeJs
  • tomcat
  • ELK
  • Mysql数据库
  • Nosql数据库
  • C/C++底层开发
  • 音视频/流媒体
  • linux服务器
  • nginx服务器
  • 容器技术
  • 负载均衡
  • 项目管理
  • 持续集成
  • 大数据
  • 微信公众号运营
  • markdown用法
赞一个
友链
联系作者
  • 分布式缓存

  • 分布式存储

  • mysql

  • postgresql

  • mongodb

  • c或c++

  • golang

  • php

  • java

  • nodejs

    • 安装node版本管理工具nvm
    • node版本管理工具nvm常见用法
    • 配置node npm国内镜像地址
    • 使用docker安装node环境
    • 配置node yarn国内镜像地址
    • centos安装nodejs
    • 升级package.json中npm包的版本
    • nodejs爬虫框架puppeteer的用法
      • 1. 示例
      • 2. puppeteer包的选择
      • 3. 脚手架
  • python

  • tomcat

  • elk

  • 音视频流媒体

  • 后台
  • nodejs
王世彪
2021-03-11

nodejs爬虫框架puppeteer的用法

# nodejs爬虫框架puppeteer的用法

本文讲解爬虫框架puppeteer的基本用法。puppeteer是一个基于nodejs开发的一套爬虫框架,由谷歌开源, 支持headless无头浏览器,与其它同类型(支持headless)的爬虫框架相比,该框架的功能更加强大,可以通过"拦截网络请求"来实现数据的爬取。

# 1. 示例

在此提供一个示例。
实现的功能: 通过程序启动chrome浏览器,然后人为输入账号信息完成登录,切换到广告列表页面,然后程序会自动定时刷新页面,通过拦截接口请求来爬取数据, 然后通过分析接口数据来做进一步的监控报警等工作,达到实现双手的目的。

const puppeteer = require("puppeteer-core");
let browser;
let browserPage;

(async () => {
    try {
        browser = await puppeteer.launch({
            args: ['--no-sandbox', '--disable-setuid-sandbox'],
            executablePath: "C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe",
            headless: false
        });
        browserPage = await browser.newPage();

        // 设置请求拦截器
        await browserPage.setRequestInterception(true);
        getResponseMsg(browserPage);

        // await crawGameList();
        await browserPage.goto("https://channel.xingchenjia.com/#/pch5/codemanage", {timeout: 120000});
        console.log("waiting for login");
        await sleep(30000);
        console.log("finish login");

        while(1){
            try {
                // 点击"禁用tab"页
                let queryBtnSelector = "div#tab-d";
                await browserPage.waitForSelector(queryBtnSelector);
                await browserPage.click(queryBtnSelector);
                console.log("query ad list", formatDate(new Date().getTime()));

                //遍历点击所有页码
                let maxPageCount = 10;
                totalCountRecentOneHour = 0;
                for(let i = 1; i <= maxPageCount; i++){
                    console.log("list all page, latestAdCurrentPage:", i, latestAdCurrentPage.updatetime);
                    try {
                        await browserPage.click("ul.el-pager li:nth-child("+ i +")");
                    } catch (error) {
                        console.log("click current page err", i, error);
                    }
                    await sleep(5000);
                }

                // 更新全局的globalLatestAd
                updateGlobalLatestOne();
                
                // 睡眠60分钟
                await sleep(3600000);
            } catch (error) {
                console.log("exception1", error);
            }
        }

    } catch (e) {
        console.error("exception2", e)
    } finally {
        if (browser != null){
            browser.close();
        }
    }
})();

/**
 * 
 * @param {拦截http请求} page 
 */
async function getResponseMsg(page) {
    return new Promise((resolve, reject) => {
        page.on('request', request => {
            console.log("拦截到http请求", request.url())
            request.continue();
        });

        page.on('response', response => {
            console.log("拦截到http请求的响应", response.url());
            if (response.url() == 'https://channel.xingchenjia.com/v2/media/clientadlist') {
                let message = response.text();
                message.then(function (responseResult) {
                    let responseJson = JSON.parse(responseResult);
                    console.log("http请求的返回数据为", responseJson.data)
                    resolve(responseResult);
                });
            }
        });
    }).catch(new Function()).then();
}

# 2. puppeteer包的选择

项目的依赖包选择puppeteer或puppeteer-core都可以,两者的关系为puppeteer = puppeteer-core + chrome浏览器,但是推荐使用puppeteer-core,因为这样依赖的体积相对小一些,加快依赖的安装速度。

  • puppeteer
    相当于安装了puppeteer-core,并额外安装一个chrome浏览器,不仅增加了依赖包的体积,也影响依赖的安装速度。
    若机器上之前没有安装过chrome浏览器,那么可以采用该方案,否则建议采用方案puppeteer-core。
    引用方式如下:
const puppeteer = require("puppeteer");
  • puppeteer-core 若本地已经安装过chrome浏览器,那么强烈建议采用该方案,这样就减少了依赖包的体积,也提升了依赖的安装速度。
    引用方式如下:
const puppeteer = require("puppeteer-core");

如上所示,选用不同的方案,开头的require方式有所区别, 需要指定不同的名称。

# 3. 脚手架

可以基于我的开源项目spider_puppeteer (opens new window)作为脚手架来开发,代码质量不太好,见谅!

#nodejs#puppeteer#爬虫
上次更新: 2021-03-11 14:07:02
升级package.json中npm包的版本
alpine安装python3

← 升级package.json中npm包的版本 alpine安装python3→

最近更新
01
mysql创建用户
04-09
02
golang错误处理最佳实践
03-17
03
基于proto文件生成rpc接口定义文档
03-11
更多文章>
Theme by Vdoing | Copyright © 2019-2022 王世彪 | MIT License
冀ICP备19016776号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式