nodejs爬虫库—puppeteer的使用
很香的一个爬虫库,在熟练掌握我原生JS的使用下,使用该库,轻轻松松爬取各种数据~
该文章只记录个人认为比较好用的几个函数,如需要详细介绍请看相关文档:
安装
cnpm i --save puppeteer --ignore-scripts
–ignore-scripts 是不安装内置的浏览器,否则node_modules会很大,后续我们直接使用自己的谷歌浏览器或是下一个最新版的谷歌浏览器就好
浏览器地址:https://registry.npmmirror.com/binary.html?path=chromium-browser-snapshots/
安装好以后,新建一个js文件,输入如下代码
const puppeteer = require('puppeteer')
;(async () => {
//创建一个浏览器对象
const browser = await (puppeteer.launch({
// 若是手动下载的chromium需要指定chromium地址, 默认引用地址为 /项目目录/node_modules/puppeteer/.local-chromium/
executablePath: '这里换成自己的谷歌地址',
ignoreDefaultArgs: ['--disable-extensions'],
//设置超时时间
// timeout: 15000,
//如果是访问https页面 此属性会忽略https错误
// ignoreHTTPSErrors: true,
// 窗口大小
// defaultViewport: {
// width: 1500,
// height: 700
// },
// 打开开发者工具, 当此值为true时, headless总为false
// devtools: false,
// 关闭headless模式, 会打开浏览器
headless: false
}));
//创建一个页面,指向百度
const page = await browser.newPage();
await page.goto("https://www.baidu.com");
// 输入搜索内容,并点击搜索
await page.evaluate(() => {
$("#kw").val("初音未来");
$("#su").click();
});
// 等待页面跳转并加载完成
await page.waitForNavigation({ waitUntil: "networkidle0" });
// 点击图片选项
await page.evaluate(() => {
$(".s-tab-pic_p4Uej")[0].click();
});
// 等待页面跳转并加载完成
await page.waitForNavigation({ waitUntil: "networkidle0" });
// 选取图片地址并返回
const data = await page.evaluate(() => {
const res = [];
$(".main_img.img-hover").each(function () {
res.push($(this).attr("src"));
});
return res;
});
// 打印结果
console.log(data);
})()
通过以上代码,能爬取部分初音未来相关图片
个人常用函数:
//等待页面跳转完成后不再有网络连接
await page.waitForNavigation({ waitUntil: "networkidle0" })
//等待1S
await new Promise(r=>setTimeout(r,1000))
//在页面里执行代码,可返回值
await page.evaluate(() => {});
//截图
await page.screenshot({
path: './paper.jpeg', //路径
fullPage: true, //是否是完整的页面
quality:70 //质量,0~100
});
//设置视口大小
await page.setViewport({
width: 1920,
height: 1080,
});
//按下回车键
await page.keyboard.press('Enter')
//以下都可传入{ waitUntil: "networkidle0" }
//page.goto:打开新页面
//page.goBack :回退到上一个页面
//page.goForward :前进到下一个页面
//page.reload :重新加载页面
个人觉得核心就是evaluate,包括一些滚动事件,能写原生JS代码就很香,不用记那么多API,evaluate用好就够了,剩下看个人JS DOM操作功底啦~
具体详细可看中文官方文档:
https://zhaoqize.github.io/puppeteer-api-zh_CN/
注:以下是page.keyboard.press可使用的按键
'0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' |
'Power' | 'Eject' | 'Abort' | 'Help' | 'Backspace' | 'Tab'|
'Numpad5' | 'NumpadEnter' | 'Enter' | '\r' | '\n' | 'ShiftLeft' |
'ShiftRight' | 'ControlLeft' | 'ControlRight' | 'AltLeft' | 'AltRight' |
'Pause' | 'CapsLock' | 'Escape' | 'Convert' | 'NonConvert' | 'Space' |
'Numpad9' | 'PageUp' | 'Numpad3' | 'PageDown' | 'End' | 'Numpad1' |
'Home' | 'Numpad7' | 'ArrowLeft' | 'Numpad4' | 'Numpad8' | 'ArrowUp' |
'ArrowRight' | 'Numpad6' | 'Numpad2' | 'ArrowDown' | 'Select' | 'Open' |
'PrintScreen' | 'Insert' | 'Numpad0' | 'Delete' | 'NumpadDecimal' |
'Digit0' | 'Digit1' | 'Digit2' | 'Digit3' | 'Digit4' | 'Digit5' |
'Digit6' | 'Digit7' | 'Digit8' | 'Digit9' | 'KeyA' | 'KeyB' | 'KeyC' |
'KeyD' | 'KeyE' | 'KeyF' | 'KeyG' | 'KeyH' | 'KeyI' | 'KeyJ' | 'KeyK' |
'KeyL' | 'KeyM' | 'KeyN' | 'KeyO' | 'KeyP' | 'KeyQ' | 'KeyR' | 'KeyS' |
'KeyT' | 'KeyU' | 'KeyV' | 'KeyW' | 'KeyX' | 'KeyY' | 'KeyZ' |
'MetaLeft' | 'MetaRight' | 'ContextMenu' | 'NumpadMultiply' |
'NumpadAdd' | 'NumpadSubtract' | 'NumpadDivide' |
'F1' | 'F2' | 'F3' | 'F4' | 'F5' | 'F6' | 'F7' | 'F8' | 'F9' | 'F10' |
'F11' | 'F12' | 'F13' | 'F14' | 'F15' | 'F16' | 'F17' | 'F18' | 'F19' |
'F20' | 'F21' | 'F22' | 'F23' | 'F24' | 'NumLock' | 'ScrollLock' |
'AudioVolumeMute' | 'AudioVolumeDown' | 'AudioVolumeUp' |
'MediaTrackNext' | 'MediaTrackPrevious' | 'MediaStop' |
'MediaPlayPause' | 'Semicolon' | 'Equal' | 'NumpadEqual' |
'Comma' | 'Minus' | 'Period' | 'Slash' | 'Backquote' | 'BracketLeft' |
'Backslash' | 'BracketRight' | 'Quote' | 'AltGraph' | 'Props' |
'Cancel' | 'Clear' | 'Shift' | 'Control' | 'Alt' | 'Accept' |
'ModeChange' | ' ' | 'Print' | 'Execute' | '\u0000' |
'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' |
'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' |
'y' | 'z' | 'Meta' | '*' | '+' | '-' | '/' | ';' | '=' | ',' | '.' |
'`' | '[' | '\\' | ']' | "'" | 'Attn' | 'CrSel' | 'ExSel' | 'EraseEof' |
'Play' | 'ZoomOut' | ')' | '!' | '@' | '#' | '$' | '%' | '^' | '&' |
'(' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' |
'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' |
'X' | 'Y' | 'Z' | ':' | '<' | '_' | '>' | '?' | '~' | '{' | '|' | '}' |
'"' | 'SoftLeft' | 'SoftRight' | 'Camera' | 'Call' | 'EndCall' |
'VolumeDown' | 'VolumeUp'