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 pageconst 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 = falseconst page = await browser.newPage()// 设置随机 User-Agentconst userAgent = getRandomUserAgent();await page.setUserAgent(userAgent);// 从文件读取 cookiesconst cookiesJson = fs.readFileSync('qcccookies.json', 'utf8');if (cookiesJson) {const cookies = JSON.parse(cookiesJson);// 在页面加载之前设置 cookiescookies && 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 nameawait page.type('body > input', config.account, { delay: typeDelay });// insert pwdawait 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 = nullawait 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'); // 例如等待页面加载完成// 页面存 pdfawait 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.evaluateconst 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',
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/371754.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】网络新手村

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 引言 今天,我们就开始学习Linux网络相关的内容。这篇博客作为Linux网络板块的第一篇博客看,我们首先要带着大家明白Linux网络的一些名词的概念,为之后的学习扫清障碍。然后我…

权限控制权限控制权限控制权限控制权限控制

1.权限的分类 视频学习:https://www.bilibili.com/video/BV15Q4y1K79c/?spm_id_from333.337.search-card.all.click&vd_source386b4f5aae076490e1ad9b863a467f37 1.1 后端权限 1. 后端如何知道该请求是哪个用户发过来的 可以根据 cookie、session、token&a…

开源六轴协作机械臂myCobot 280接入GPT4大模型!实现更复杂和智能化的任务

本文已经或者同济子豪兄作者授权对文章进行编辑和转载 引言 随着人工智能和机器人技术的快速发展,机械臂在工业、医疗和服务业等领域的应用越来越广泛。通过结合大模型和多模态AI,机械臂能够实现更加复杂和智能化的任务,提升了人机协作的效率…

easyexcel使用小结-未完待续

官网&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/ <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.1</version></dependency>一、读 1.1简单读 Getter…

Android-卷积神经网络(Convolutional Neural Network, CNN)

一个复杂且在Android开发中常见的算法是图像处理中的卷积神经网络(Convolutional Neural Network, CNN)。CNN被广泛用于图像识别、物体检测和图像分割等任务,其复杂性在于需要处理大量的图像数据、复杂的神经网络结构和高效的计算。 1. 卷积操作(Convolution) 数学原理:…

stm32——外部中断EXTI

上回书说到定时器的级联&#xff0c;今天来谈谈外部中断EXTI。我使用的是STM32F103C8T6的学习板。仅供大家参考。 什么是中断呢&#xff1f;中断是指计算机在执行程序的过程中&#xff0c;当出现某些异常情况或特殊事件&#xff08;例如外部设备请求、定时时间到达、程序错误等…

LeetCode 744, 49, 207

目录 744. 寻找比目标字母大的最小字母题目链接标签思路代码 49. 字母异位词分组题目链接标签思路代码 207. 课程表题目链接标签思路代码 744. 寻找比目标字母大的最小字母 题目链接 744. 寻找比目标字母大的最小字母 标签 数组 二分查找 思路 本题比 基础二分查找 难的一…

Java求解百钱买百鸡问题(课堂实例2)

目录 &#x1f495;&#x1f495;引言&#x1f495;&#x1f495; &#x1f60d;&#x1f60d;点关注编程梦想家&#xff08;大学生版&#xff09;-CSDN博客不迷路&#x1f495;&#x1f495; 一、问题背景----百鸡百钱_百度百科 (baidu.com) &#x1d465;&#x1d466;&a…

黑马点评报错@user_script:17: user_script:17: attempt to compare nil with number

后面发现是需要预先写入缓存seckill:stock:11&#xff0c;其中11是优惠券id 我数据库里面是11 &#xff0c;这里redis里面也写了11之后就好使了

html+css+JavaScript 实现两个输入框的反转动画

开发时遇到了一个输入框交换的动画 做完之后觉得页面上加些许过渡或动画&#xff0c;其变化虽小&#xff0c;却能极大的提升页面质感&#xff0c;给人一种顺畅、丝滑的视觉体验。它的实现过程主要是通过css中的transition和animation来实现的。平时在开发的时候增加一些动画效…

python安装PyTorch+cuda

1,最终结果 import torchprint(torch.cuda.is_available()) #显示True&#xff0c;则安装成功 print(torch.__version__)#打印当前PyTorch版本号。 print(torch.version.cuda)#打印当前CUDA版本号。 print(torch.backends.cudnn.version())# 打印当前cuDNN版本号。 print(torc…

vuepress创建步骤

背景 记录vuepress配置步骤&#xff0c;以便下次使用快速上手。 读此文章之前默认您已经学会了创建vuepress项目。vuepres快速开始 最终成品 doc.jeecgflow.com 配置步骤 创建.vuepress 目录。 你的文档目录下创建一个 .vuepress 目录。 创建.vuepress/config.js module.e…

【Whisper】WhisperX: Time-Accurate Speech Transcription of Long-Form Audio

Abstract Whisper 的跨语言语音识别取得了很好的结果&#xff0c;但是对应的时间戳往往不准确&#xff0c;而且单词级别的时间戳也不能做到开箱即用(out-of-the-box). 此外&#xff0c;他们在处理长音频时通过缓冲转录

法国工程师IMT联盟 密码学及其应用 2022年期末考试

1 密码学 1.1 问题1 对称加密&#xff08;密钥加密) 1.1.1 问题 对称密钥la cryptographie symtrique和公开密钥有哪些优缺点&#xff1f; 1.1.1.1 对称加密&#xff08;密钥加密)的优缺点 1.1.1.1.1 优点 加解密速度快encrypt and decrypt&#xff1a;对称加密算法通常基于…

四川蔚澜时代电子商务有限公司持续领跑抖音电商

在当今这个数字化飞速发展的时代&#xff0c;电子商务已成为推动经济增长的重要引擎。而在众多电商平台中&#xff0c;抖音电商以其独特的社交属性和年轻化的用户群体&#xff0c;逐渐崭露头角。四川蔚澜时代电子商务有限公司正是这股潮流中的佼佼者&#xff0c;他们专注于抖音…

【matlab 路径规划】基于改进遗传粒子群算法的药店配送路径优化

一 背景介绍 本文分享的是一个基于订单合并的订单分配和路径规划联合优化&#xff0c;主要背景是骑手根据客户需求&#xff0c;从药店取药之后进行配送&#xff0c;配送的过程中考虑路径的长度、客户的服务时间窗、车辆的固定成本等要素&#xff0c;经过建模和优化得到最优的配…

Qt 网络编程实战

一.获取主机的网络信息 需要添加network模块 QT core gui network主要涉及的类分析 QHostInfo类 QHostInfo::localHostName() 获取本地的主机名QHostInfo::fromName(const QString &) 获取指定主机的主机信息 addresses接口 QNetworkInterface类 QNetworkInterfac…

小试牛刀-区块链代币锁仓(Web页面)

Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友&#xff0c;喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…

挑战杯 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

7月8号直播预告 | 全国产EtherCAT运动控制器ZMC432HG及其EtherCAT驱动器与控制器常用回零模式介绍

EtherCAT运动控制边缘控制器是工业互联网的关键组件之一&#xff0c;结合丰富的运动控制功能、实时数据采集、处理和本地计算等&#xff0c;具备高度灵活的可编程性和出色的运动控制性能&#xff0c;为运动控制协同工业互联网应用带来巨大市场潜力&#xff0c;同时也使其成为企…