Puppeteer项目结构梳理

news/2024/10/23 7:35:57/

最近接触了一个个人感觉很奈斯的项目,故记录思路如下:

puppeteer项目梳理:
入口文件 run.js
入口命令 node run.js YourConfig.json

大概逻辑


1、我们可以在自己的config.json里面设置好
①、登录的用户名密码;aws或其它服务器的access等id,accessKey, region等信息;
cookie的路径,要上传到s3或者oss等对象存储平台的文件的路径;
oss和s3的比较
②、要运行的命令放在一个modules{}里面,proxy的设置,headless:true等访问浏览器的设置。

2、爬虫最好是运用模块化思想,把重复用的功能单独的拎出来
在run.js里面我们可以import我们自己其他的js文件。
①首先是import {LoadConfig} from config.js
这个LoadConfig主要是存储从config.解析的变量。
const argv = process.argv.slice(2);
const configPath = argv[0];
const config = JSON.parse(fs.readFileSync(configPath));

这是关于node的process相关内容的参考文章

类似这种,把config.json的信息都解析到数组argv里面,然后按照不同key,设置不同键值对,最后以export LoadConfig导出。
通过这种方式,我们就看把config.json里面的配置按照键值对保存了LoadConfig的数组里面。

②关于s3的配置方法封装到S3Init.js文件中,里面包含了s3的读写文件名,判断文件存在,读写文件流等function。
再引入一个包含save 和skip文件的storage.js方法,主要功能是如果s3已经存在了同名文件在,则判断跳过,避免爬取重复文件。
再映入一个date.js,主要是封装了判断日期,更改日期名字,获取当前日期等功能。

③关键引入import { createPage, closePage } from “./yourpath/Parsebrowser.js”;
这是主要的启动方法,通过const page = await createPage(getCookie, config.headless, config.proxy);去进行爬取,
Parsebrowser.js里面可以设置具体的chrome.exe位置,主要是为了打开浏览器。

④最关键的一步,
import { LoadConfig } from “./yourpath/config.js”;
const config = LoadConfig();
再打开到浏览器之后,在try下,去引入config.modules。因为config.modules里面是不同的js文件,每个js文件代表这一个页面的下载逻辑,
并且以{export download} 形式返回。
我们调用const page = await createPage(getCookie, config.headless, config.proxy),可以通过不同cookies访问网站;
再调用download变量方法就可以进去爬取不同页面(因为不同页面暴露的都是同一个download方法,可以通过循环依次爬取。
同时在同一个网站里,我们可以设置复用的download.js去点击下载按钮,可以设置复用的selectdate.js去选择日期等。

总结:
将关于s3的配置,打开浏览器,访问不同页面都分别独立出来。并且通过config.json去定义想要运行的js文件(所有爬虫js返回一个相同的变量),当运行到入口文件run.js时,for循环会将config.json的Modules定义的js爬虫文件一 一运行下去。
极大提高了代码复用效率以及通过json配置控制爬取页面的灵活性。

细节:
在爬取元素,有些插件的元素在页面element找不到,可能在js里面。比如日期控件picker 的ant-select-dropdown-menu类,就写在了js里面动态加载进去。


http://www.ppmy.cn/news/29134.html

相关文章

pwnlab通关流程

pwnlab通关 关于文件包含,环境变量劫持的一个靶场 信息收集 靶机ip:192.168.112.133 开放端口 根据开放的端口信息决定从80web端口入手 目录信息 在images和upload路径存在目录遍历,config.php被渲染无法查看,upload.php需…

二叉树——二叉树的最近公共祖先

二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一…

2023雅虎邮箱不能注册?别急,这份教程教你成功注册雅虎邮箱

这几年,跨境电商的迅猛发展,越来越多人加入这片蓝海,跨境人拥有一个专业的邮箱账户显得尤为重要,它是商业交流和日常工作的必备工具。因此,雅虎邮箱成为了许多人的首选,全球范围内使用雅虎邮箱的人数是非常…

解读“方差”

其实,从这个标题就可以看出来,方差,这个问题不简单, 先给出定义: 方差其实应该叫,差方差,(差方)差,差的平方的差,与差的平方之间的误差&#xff0…

【ES】Elasticsearch核心基础概念:文档与索引

es的核心概念主要是:index(索引)、Document(文档)、Clusters(集群)、Node(节点)与实例,下面我们先来了解一下Document与Index。 RESTful APIs 在讲解Document与Index概念之前,我们先来了解一下RESTful APIs,因为下面讲解Documen…

STM32F1,F4,L1系列禁止JTAG和SW引脚方法

STM32F1系列 程序中在使用到JTAG、SWD的某个IO 时,需要禁用掉相关调试方法后,再配置相应的IO方式。在需要相应的接口配置前使用这些代码。 对于F1系列,调用函数进行专门的禁止。 标准库配置方式: RCC_APB2PeriphClockCmd(RCC_A…

Python 日志

欢迎访问我的博客首页。 Python 日志1. 通过函数调用栈实现2. 改变 print 函数输出字体的颜色3. 使用 logging3.1 自定义名称的句柄3.2 使用默认句柄4. 参考1. 通过函数调用栈实现 traceback 库记录着 Python 的调用栈。使用 traceback,不仅可以输出日志位置&#x…

前端二面vue面试题总结

什么是 mixin ? Mixin 使我们能够为 Vue 组件编写可插拔和可重用的功能。如果希望在多个组件之间重用一组组件选项,例如生命周期 hook、 方法等,则可以将其编写为 mixin,并在组件中简单的引用它。然后将 mixin 的内容合并到组件中…