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',
})