当前位置: 首页 > news >正文

Puppeteer项目结构梳理

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

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里面动态加载进去。

相关文章:

Puppeteer项目结构梳理

最近接触了一个个人感觉很奈斯的项目,故记录思路如下: puppeteer项目梳理: 入口文件 run.js 入口命令 node run.js YourConfig.json 1、我们可以在自己的config.json里面设置好 ①、登录的用户名密码;aws或其它服务器的access等id,accessKey…...

(02)Unity HDRP Volume 详解

1.概述这篇文章主要针对HDRP中的Volume和Volume Post-processing进行解释,针对于各个组件只能进行部分参数的解释,具体的信息可参考官方资料,这里只是对官方文档的图片效果补充以及笔者自己的理解。看到这里进入正文,请确保你的Un…...

拒绝B站邀约,从月薪3k到年薪47W,我的经验值得每一个测试人借鉴

有时候,大佬们总是会特立独行。因为像我这样的常人总是想不通,究竟是怎样的情境,连B站这样的大厂面试都可以推掉? 缘起一通电话,踏出了改变人生轨迹的第一步 我是小瑾,今年28岁,2016年毕业于陕…...

分享一种实用redis原子锁的方式

1. setnx(lockkey, 当前时间过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向2。2. get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间…...

【华为OD机试】 字符串解密(C++ Java JavaScript Python)

题目描述 给定两个字符串string1和string2。 string1是一个被加扰的字符串。 string1由小写英文字母(’a’’z’)和数字字符(’0’’9’)组成,而加扰字符串由’0’’9’、’a’’f’组成。 string1里面可能包含0个或多个加扰子串,剩下可能有0个或多个有效子串,这些有…...

金三银四,助力你的大厂梦,2023年软件测试经典面试真题(1)(共3篇)

前言 金三银四即将到来,相信很多小伙伴要面临面试,一直想着说分享一些软件测试的面试题,这段时间做了一些收集和整理,下面共有三篇经典面试题,大家可以试着做一下,答案附在后面,希望能帮助到大…...

假如面试官要你手写一个promise

promise 在开发中,经常需要用到promise,promise具有很多特性,这一次将对promise特性进行总结,并从零写一个promise。 步骤一 Promise特点 1,创建时需要传递一个函数,否则会报错2,会给传入的函…...

【leetcode】寻找重复数

题目链接:寻找重复数https://leetcode.cn/problems/find-the-duplicate-number/ 方法一:快慢指针 因为只有一个数字是重复的,且一个数字正好对应一个唯一的下标,所以可以将数组抽象为一个链表,假定数组为{1,2,3,4,5,…...

LeetCode 1247. Minimum Swaps to Make Strings Equal【数学,贪心,字符串】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

pid控制加热算法,附代码仓库

1、该项目层次化结构清晰,代码框架耦合度低,可复用性、可移植性强。 2、功能代码与底层硬件无直接关联,无需更改上层应用逻辑,只需更改接口文件,即可移植到不同的硬件平台; 3、使用lwrb开源组件、pid开源算…...

一文看懂预训练和自训练模型

说到预训练模型,不得不提迁移学习了,由于很多数据不是标签数据,人工标注非常耗时,神经网络在很多场景下受到了限制。但是迁移学习和自学习的出现,在一定程度上缓解甚至解决了这个问题。我们可以在标签丰富的场景下进行…...

(五十四)大白话索引的页存储物理结构,是如何用B+树来实现的?.md

上一次我们给大家说了主键索引的目录结构,只要在一个主键索引里包含每个数据页跟他最小主键值,就可以组成一个索引目录,然后后续你查询主键值,就可以在目录里二分查找直接定位到那条数据所属的数据页,接着到数据页里二…...

前端Vue代码风格指南

一、命名规范 市面上常用的命名规范: camelCase(小驼峰式命名法 —— 首字母小写) PascalCase(大驼峰式命名法 —— 首字母大写) kebab-case(短横线连接式) Snake(下划线连接式&…...

「TCG 规范解读」基础设施架构和协议 (2)

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…...

NodeJs 中的 HTML 模板

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 HTML 模板是一种允许我…...

3.ffmpeg命令行环境搭建、ffmpeg命令行初步了解

在上章,我们讲过: ffmpeg.exe: 主要用于转码或者剪切的应用程序, 也可以从url/现场音频/视频源抓取输入源ffplay.exe: 主要用于播放视频的应用程序,该应用程序源码是开源的,我们后面章节会去源码分析ffprobe.exe: 主要用于分析视频码流的应用程序, 可以获取媒体文件的详细信息,…...

Kubernetes初始化容器

初始化容器 之前了解了容器的健康检查的两个探针:liveness probe(存活探针)和readiness probe(可读性探针)的使用方法,我们说在这两个探针是可以影响容器的生命周期的,包括我们之前提到的容器的…...

leetcode: Swapping Nodes in a Linked List

leetcode: Swapping Nodes in a Linked List1. 题目描述2. 题目解答3. 总结1. 题目描述 You are given the head of a linked list, and an integer k.Return the head of the linked list after swapping the values of the kth node from the beginning and the kth node f…...

Nydus 在约苗平台的容器镜像加速实践

文 | 向申 约苗平台运维工程师 关注云原生领域 本文字数 9574阅读时间24分钟 本文是来自向申同学的分享,介绍了其在 K8s 生产环境集群部署 Nydus 的相关实践。 Nydus 是蚂蚁集团,阿里云和字节等共建的开源容器镜像加速项目,是 CNCF Dragon…...

企业对不同形态CRM系统价格需求不同

很多企业在选型时关心CRM客户管理系统的价格,有人对CRM的价格完全没有概念,也有的人先问价格再看其他。CRM价格在系统选型中到底有多重要?不同类型CRM系统的价格是否有所不同? CRM的不同产品形态也会影响价格 通常情况下&#x…...

「JVM 高效并发」线程安全

面向过程编程,把数据和过程分别作为独立的部分考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据;面向对象编程,把数据和行为都看做对象的一部分,以符合现实世界的思维方式来编写和组织程序&#…...

微信扫码登录

一、准备工作 微信开发者平台:https://open.weixin.qq.com 1、注册 2、邮箱激活 3、完善开发者资料 4、开发者资质认证:仅能企业注册(后面提供学习的使用渠道)准备营业执照,1-2个工作日审批、300元 5、创建网站应用&…...

Unity协程的简单应用

Unity协程是一种特殊的函数,可以让你在Unity中创建一种类似于多线程的异步操作。它可以在需要等待某个操作完成时,暂停执行当前代码,等待某个条件满足后再继续执行。 在一般情况下 unity中调用函数时,函数将运行到完成状态&#x…...

LeetCode 1250. Check If It Is a Good Array【数论】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

ETHDenver 2023

ETHDenver是全球最大、持续时间最长的以太坊活动之一,今年的活动定于2月24日至3月5日在美国科罗拉多州丹佛市盛大举行。这次活动将面向以太坊和其他区块链协议爱好者、设计者和开发人员。Moonbeam作为ETHDenver 2023的Meta赞助商,将在本次活动中展示令人…...

React架构演变

老版React架构 React 16之前的架构 其实就分为两个部分: Reconciler协调器Render渲染器 Reconciler协调器负责本次更新有什么组件需要被渲染,diff算法就发生在这个步骤中,在diff算法中会将上次更新的组件和本次更新的组件做一个对比&…...

安全认证--JWT介绍及使用

安全认证--JWT介绍及使用1.无状态登录原理1.1.什么是有状态?1.2.什么是无状态1.3.如何实现无状态1.4.JWT1.4.1.简介1.4.2.数据格式2.编写JWT工具2.1.添加JWT依赖2.2.载荷对象2.3.工具2.4.测试2.4.1.配置秘钥2.4.2.测试类1.无状态登录原理 有状态登录和无状态登录详…...

【计算机组成原理】计算机硬件的基础组成、认识各个硬件部件

计算机组成原理(一) 计算机内部是通过电信号传递数据 电信号:分为高电平和低电平,分别代表1/0 数字、文字、图像如何用二进制表示? CPU如何对二进制数进行加减乘除? 如何存储这些二进制数的? 如何从内存中取出想要的数…...

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cuttag等富集峰的基因组注释

二代测序产生的数据类型 常规的下一代高通量测序(next generation sequencing, NGS)实验通常产生大量短片段(reads),通常我们需要将这些reads比对到参考基因组/转录组上,即将它们置于生物学上有意义的基因背景下,才能…...

第九届蓝桥杯省赛——7缩位求和

题目:在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。比如:248 * 15 3720把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是1位数,得2 4 8 14 > 1 4 5;1 5 65…...

网站备案 多ip/免费创建个人博客网站

学习目的及目标 掌握UDP原理和工作过程 掌握乐鑫ESP32的UDP的程序设计 主要掌握UDP源码过程UDP科普(来自百度百科)UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型…...

电子商务网站开发流程/百度问答我要提问

收听地址S01E01-开发者关系 (DevRel) 是开源项目和开源社区的加速器嘉宾Feynman Zhou[1] (周鹏飞)主持人majinghe[2](开源爱好者、DevOps 技术布道师)Rick[3](开源爱好者、业余开源布道师)Wey Gu[4](开源相信者、程序员…...

织梦网站怎么做301/广州网站优化外包

目录 1、MYSQL数据结构 2、MYSQL常用函数 3、MYSQL操作流程 4、实例 MySQL是一个开源码的小型关系数据库管理系统,体积小,速度快,总体成本低,开源。MySQL有以下特性: (1) 使用C和C编写,并使用了多种编译器进行测试&…...

临沂网站推广goldball/河源市企业网站seo价格

对于一些数据我们需要进行加密,下面介绍加密的一种方法 前端vue对密码进行加密 import CryptoJS from crypto-js// 默认的 KEY 与 iv 如果没有给 const KEY CryptoJS.enc.Utf8.parse("1234567890123456"); const IV CryptoJS.enc.Utf8.parse(1234567890…...

如何申请做网站编辑呢/西安seo服务外包

版权声明:本文为博主原创文章,转载请标明作者和原链接https://blog.csdn.net/qq_42239046/article/details/88683284当在ecplise中创建了一个web项目,一般都可以run server,如果不能那就是tomcat没有安装好或这版本有问题或者jdk的…...

数学网站怎么做的/济南网站建设

好久之前做的题了QWQ 现在来补一发博客 一道神仙题啊。。qwq 首先,我们可以看出来,我们如果对于每个点维护一个\(val\),表示他的直系儿子中有几个表现为1的。 那么\(val[x]>>1\) 就是他反应的类型 这样十分便于我们计算一开始的\(val\)…...