這里介紹的是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 = https://www.cnblogs.com/braink-1400/p/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);
}
}
}
})();
請合理利用,我一不小心就被封號了??
PS:還有一些更加高級的用法比如request和response,以后用到了再++
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/165623.html
標籤:JavaScript
