这里介绍的是Win平台的安装方法,其他平台请至Github>Puppeteer.

首先要安装node.js 可以看我这篇的开头>【Angular】学习笔记-环境部署、项目建立相关

1.新建项目目录

2.打开gitbush(常用的Terminal都可以)

3.键入

npm i puppeteer

4.等。。。。。。待安装

ps:安装会带一个Chromium 还是挺大的。。

到这里基本上就算安装完成了。


官方栗子:

const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'example.png'}); await browser.close();
})();

使用,打开Terminal

// node 文件名.js
node example.js

这里以百度为例。

运行程序后自动截图保存到当前根目录下。


一些常用的方法:

const browser = await puppeteer.launch(); // 启动一个浏览器实例
const page = await browser.newPage(); // 新建一个网页(page)
await page.setUserAgent(); // 设定UA(不同UA会有不同的效果),用来模拟不同设备对网页的浏览。
await page.goto(); // 跳转到指定地址。
await page.close(); // 关闭此page
//=======================================
// 获取网页中的一些元素或者是控件
const testSelector = await page.waitForSelector(); // 等待指定的selector加载出来。 await testSelector.type(); // 假如是输入框,则可以利用type键入关键字。
await testSelector.click(); // 假如是按钮,则可以click。 // 执行自己写的js代码
await page.evaluate();
// 小栗子(执行scroll) 页面滚动效果
await page.evaluate(_ => {
window.scrollBy(0, window.innerHeight);
});
// 类似的有等待selector后执行js代码
await page.$eval(selector, ele => ele.innerHTML); // 获取指定(单个)selector内的HTML字符串 await page.$$eval(selector, ele => ele.map(a => a.getAttribute("href").trim())); // 获取多个selector内"href"的内容。(结果是数组,可以遍历出每个结果)
//=======================================
// 登陆验证相关
// 一般的网站会使用 Cookie/localStorage等保存登陆的信息到本地,那么我们不必每次都模拟登陆操作(避免反复登陆触发验证机制。)
// setCookie, 如Youtube就是使用的cookie登陆
await page.setCookie();
// localStorage,localStorage能存储更多的信息(localStorage是属于JS的方法,所以需在page.evaluate()内执行)
await page.evaluate(() => {
localStorage.setItem(key, value);
});
// PS:两种方法都有小坑。
// setCookie必须在page新建之前。
// localStorage.setItem() 对指定网站必须先goto=>然后set=>然后再goto

自己写的小栗子:Github地址>puppeteer_youtube_Autoresponder

const puppeteer = require("puppeteer");
const log = console.log; ///selector///
// video_title
var video_title_selector = "#video-title"; // 顶
var like_btn_selector = "#like-button"; // 踩
var dislike_btn_selector = "#dislike-button"; // // 回复按钮
var reply_btn_selector = "#reply-button-end"; // 输入框
var contenteditorbox_selector = "#contenteditable-root"; //评论确定按钮
var reply_sub_btn_selector = "#submit-button"; ///selector/// //自定评论内容
var reply_content = ""; //Main
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// 设置UA
await page.setUserAgent(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
);
// 这里使用cookie来登陆youtube账户
await page.setCookie(); await page.goto("https://www.youtube.com");
// search_input
const search_input = await page.waitForSelector("#search");
// type
await search_input.type("puppeteer"); // 这里键入需要查询的关键字 如"puppeteer"
// search_btn
const search_btn = await page.waitForSelector(
"#search-icon-legacy > yt-icon"
);
// search_btn_click
await search_btn.click();
await page.waitForSelector("#video-title"); await page.waitForSelector(video_title_selector); var video_href = await page.$$eval(video_title_selector, ele =>
ele.map(a => a.getAttribute("href").trim())
);
for (let index = 0; index <= video_href.length; index++) {
// 打开新页面
const tempPage = await browser.newPage();
// 重新设定UA
await tempPage.setUserAgent(
"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14"
);
await tempPage.goto("https://www.youtube.com" + video_href[index]);
await tempPage.waitFor(2000);
// 页面向下滚动
await tempPage.evaluate(_ => {
window.scrollBy(0, window.innerHeight);
});
await tempPage.waitFor(2000); // const video_title = await tempPage.waitForSelector("#eow-title");
// await video_title.click();
var m = 2;
var nomorecomment = false;
var attempcount = 0; while (true) {
try {
// 页面向下滚动
await tempPage.evaluate(_ => {
window.scrollBy(0, window.innerHeight);
});
await tempPage.waitFor(2000);
// log(m);
try {
const reply_btn = await tempPage.waitForSelector(
`#comment-section-renderer-items > section:nth-child(${m}) > div.comment-renderer.vve-check-visible.vve-check-hidden > div.comment-renderer-content > div.comment-renderer-footer > div.comment-action-buttons-toolbar > button`,
{ timeout: 500 }
);
await reply_btn.click();
// 评论
const reply_combox = await tempPage.waitForSelector(
"#comment-simplebox > div.comment-simplebox-frame > div.comment-simplebox-text"
);
// 输入评论
await reply_combox.type(reply_content);
await tempPage.waitFor(800);
// 确认评论
const confirm_btn = await tempPage.waitForSelector(
"#comment-simplebox > div.comment-simplebox-controls > div.comment-simplebox-buttons > button.yt-uix-button.yt-uix-button-size-default.yt-uix-button-primary.yt-uix-button-empty.comment-simplebox-submit.yt-uix-sessionlink"
);
await confirm_btn.click();
attempcount = 0;
} catch (error) {
attempcount++;
log(">>>>>>>index<<<<<<<", m);
if (attempcount > 6) {
await tempPage.close();
break;
}
} // 点赞
// await tempPage.$eval(
// `#comment-section-renderer-items > section:nth-child(${m}) > div.comment-renderer.vve-check-visible.vve-check-hidden > div.comment-renderer-content > div.comment-renderer-footer > div.comment-action-buttons-toolbar > span:nth-child(4) > button.yt-uix-button.yt-uix-button-size-default.yt-uix-button-default.yt-uix-button-empty.yt-uix-button-has-icon.no-icon-markup.comment-action-buttons-renderer-thumb.yt-uix-sessionlink.sprite-comment-actions.sprite-like.i-a-v-sprite-like`,
// ele => ele.setAttribute("aria-checked", "true")
// );
m++;
await tempPage.waitFor(3000);
// //测试
//
try {
if (nomorecomment == false) {
const loadmore = await tempPage.waitForSelector(
"#comment-section-renderer > button > span > span.load-more-text"
);
await loadmore.click();
}
} catch (error) {
nomorecomment = true;
}
} catch (e) {
console.error(e);
}
}
}
})();

请合理利用,我一不小心就被封号了

【Puppeteer】puppeteer安装/常用的方法以及一个小栗子(Youtube油管自动评论)的更多相关文章

  1. 一个小栗子聊聊JAVA泛型基础

    背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪. 对泛型的认识不够,导致代码出现了BUG. 第一个原因可以通过以后编码 ...

  2. 关于 Enum.TryParse 方法的一个小坑…

    今天在测试导入数据的时候,突然发现本应该是枚举内容的数据,导入了进了一个很大的不在枚举定义内的数字. 记得当时用的是 Enum.TryParse 方法对导入的文本进行校验的,于是调试了一下,发现果然是 ...

  3. SPClaimsUtility.AuthenticateFormsUser 方法的一个小问题

    前言 最近,开启了Form认证,发现Form账号前面加空格,或者后面加空格都可以登录站点,但是提示未共享. 解决方法 后来bing了很多帖子,发现大家都遇到过类似的问题,问题是由于SPClaimsUt ...

  4. Fedora24安装常用软件方法

    # 添加chrome源 cd /etc/yum.repos.d/ # 下载google-chrome.repo并保存# wget  http://repo.fdzh.org/chrome/google ...

  5. JAVA的toString方法的一个小例子

    Object是一个抽象类,他有很有方法,其中的toString方法是我们常见的一个方法,我们可以看这段代码 package com.com.day1; public class ToStringTes ...

  6. 前端开发HTML&css入门——常用的标签以及一个小练习

    meta标签 <!doctype html> <html> <head> <meta charset="utf-8" /> < ...

  7. [python学习] 介绍python的property,以及为什么要用setter,一个小栗子

    python中的property是比较好用的. 先来一段代码 #-*- coding:utf-8 -*- class C(object): status_dict = { 1: 'accept', 2 ...

  8. binwalk windows安装和使用方法

    binwalk是一个文件的分析工具,旨在协助研究人员对文件进行分析,提取及逆向工程.简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展. 以上是binwalk ...

  9. Puppeteer学习笔记 (2)- Puppeteer的安装

    本文链接:https://www.cnblogs.com/hchengmx/p/11009849.html 1. node的下载安装 由于puppeteer是nodejs的一个库,所以首先需要安装no ...

随机推荐

  1. Android Application 详细介绍

    一.先看看文档里怎么说 Base class for those who need to maintain global application state. You can provide your ...

  2. MySQL必知必会(Select, Where子句)

    SELECT prod_name, prod_price FROM products WHERE prod_price = 2.5; SELECT prod_name, prod_price FROM ...

  3. luogu P2783 有机化学之神偶尔会做作弊 |Tarjan+LCA

    题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. "第1354题怎么做"&l ...

  4. 去除npm run dev日志warn记录

    目录 一 babel的一些eslint方法废除了 问题 解决方案 相关文档 二 webpack的loaderUtils.parseQuery()被废弃了 问题 解决方案 相关文档 三 postcss相 ...

  5. rbac结合ssm实现权限分配和管理

    RBAC(Role-Based Access Control )基于角色的访问控制. RBAC 认为权限的过程可以抽象概括为: 判断[Who 是否可以对 What 进行 How 的访问操作(Opera ...

  6. HDU1429

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...

  7. 洛谷 SPOJ 题解 SP1 【TEST - Life, the Universe, and Everything】

    给出一种主函数递归的方法(其实主函数 main() 也是可以递归的) #include <stdio.h> int main() { int a; scanf("%d" ...

  8. 2019企业linux运维最需要的了解的一些硬件基础知识

    第3章 服务器    245 3.1 电脑的种类    245 3.2 服务器的介绍    246 3.2.1 服务器的类别    246 3.2.2 服务器的性能    247 3.2.3 服务器的 ...

  9. iSensor APP 之 摄像头调试 OV5642

    iSensor APP 之 摄像头调试  OV5642 iSensor app 非常适合调试各种摄像头,已测试通过的sensor有: l  OV7670.OV7725.OV9650.OV9655.OV ...

  10. Python之工作方向

    "python基础-->(函数/面向对象/网络编程(scoket套接字)/并发编程(mutiprocessing)) "运维+web开发-->页面展示(django/f ...