Puppeteer 部署 - Docker容器 - Idea一键部署

Puppeteer 代码注意

部署到服务器,报错

Running as root without --no-sandbox is not supported.

解决方案:

const browser = await puppeteer.launch({
            args: ['--no-sandbox'],
            env: {
                DISPLAY: ":10.0"
            }
        });
       

Puppeteer导致服务器CPU占用率100%

描述:运行脚本后通过top命令看到CPU一直上升,最终导致CPU100%,SSH无法连接,只能重启服务器。

问题

问题为Puppeteer循环的创建启动器launch,而没有关闭。如果需要循环调用的话应该启动一个launch,循环创建新的page,或者循环调用goto。

headless: false能抓到数据但是headless: true却抓不到

在goto之前添加UserAgent就能正常访问了

        await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36");

Dockerfile

编写Dockerfile根据自己项目的文件结构来
我的目录结构与Dockerfile,main.js为入口函数,在main里面启动所有爬虫并创建定时任务
Puppeteer 部署 - Docker容器 - Idea一键部署_第1张图片

# 基于 Node.js 16 镜像
FROM node:16.20.0-slim

# 设置工作目录
WORKDIR /app
# 更新 npm
RUN npm install -g npm@latest

# 将 package.json 和 package-lock.json 复制到工作目录
COPY ./package*.json ./

# 软件源修改为淘宝的镜像源
RUN sed -i 's/http:\/\/deb\.debian\.org\/debian/http:\/\/mirrors\.aliyun\.com\/debian/g' /etc/apt/sources.list

# 更新 apt-get
RUN apt-get update

# 安装 Chromium
RUN apt-get install -y chromium

# 安装依赖
RUN npm install

# 复制源代码到工作目录
COPY ./src ./src
COPY ./main.js ./

# 设置环境变量,可根据需要进行调整
ENV NODE_ENV=production
ENV PUPPETEER_SKIP_DOWNLOAD=true
# 运行脚本
CMD [ "node", "./main.js" ]

main.js

main.js如下:

const puppeteer = require('./src/puppeteer/puppeteer'); // 亚马逊爬虫程序
const TaskManager = require('./src/utils/TaskManager'); // 定时任务管理器
// 创建定时任务管理器实例
//puppeteer.main() // 执行亚马逊爬虫程序
const taskManager = new TaskManager();
const task1 = () => {
    puppeteer.main() // 添加定时任务
};
const interval1 = 2 * 60 * 60 * 1000;
taskManager.addTask(task1, interval1, "亚马逊新品页面爬虫");

./src/puppeteer/puppeteer为自己写的爬虫,TaskManager是定时任务管理器
TaskManager.js如下

class TaskManager {
    constructor() {
        this.tasks = [];
    }

    addTask(task, interval, taskName) {
        console.log(`添加定时任务: ${taskName}`);
        const taskId = setInterval(task, interval);
        this.tasks.push({id: taskId, name: taskName});
        return taskId;
    }

    removeTask(taskId) {
        const task = this.tasks.find(task => task.id === taskId);
        if (task) {
            console.log(`移除定时任务: ${task.name}`);
            clearInterval(taskId);
            this.tasks = this.tasks.filter(task => task.id !== taskId);
        }
    }

    clearAllTasks() {
        console.log("移除所有定时任务");
        this.tasks.forEach(task => clearInterval(task.id));
        this.tasks = [];
    }
}

module.exports = TaskManager;

配置Dockerfile的启动项

使用Idea打卡项目,右键Dockerfile,点击修改运行配置
Puppeteer 部署 - Docker容器 - Idea一键部署_第2张图片
添加服务器的ssh,点击三个点
Puppeteer 部署 - Docker容器 - Idea一键部署_第3张图片
点击ssh后面的三个点配置服务器
Puppeteer 部署 - Docker容器 - Idea一键部署_第4张图片接下来回到配置页面,填写配置消息,1、镜像名称:版本号 2、容器名称 3、端口号
Puppeteer 部署 - Docker容器 - Idea一键部署_第5张图片
配置好以后,运行Dockerfile
Puppeteer 部署 - Docker容器 - Idea一键部署_第6张图片
构建镜像会花费一定的时间,最后会显示容器部署成功
Puppeteer 部署 - Docker容器 - Idea一键部署_第7张图片

查看Puppeteer 脚本运行情况

pc为容器名称,–tail 500 表示查看文件末尾500行数据

docker logs -f --tail 500 pc

在这里插入图片描述

你可能感兴趣的:(docker,intellij-idea,容器)