安装
步骤一:新建目录puppeteerProject
步骤二:初始化项目npm init
步骤三:npm i puppeteer
(此处需要下载Chromium,如果下载失败更换为cnpm)
中途会下载Chromium,大小300M
保存路径\node_modules\puppeteer\.local-chromium\win64-588429\chrome-win32
配置相关
const browser = await puppeteer.launch({ headless: false, // default is true 打开运行界面 executablePath: 'C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe' // 在正式的chrome浏览器中运行代码 slowMo: 250 // slow down by 250ms });
防止被反爬虫识别
puppeteer特征属性
navigator.userAgent
配置中如果headless未设置或者为true,此时userAgent中会包含headlessChrome
navigator.webdriver
正常浏览器中并没有这个属性,puppeteer被特别添加,可以用如下代码验证
const navigator = await page.evaluate(()=>{ return { webdriver:navigator.webdriver, userAgent:navigator.userAgent }; }); console.log('navigator=',navigator); //navigator.webdriver返回true
webdriver在launch的配置参数中隐藏
ignoreDefaultArgs:['--enable-automation']
设置userAgent
page.setUserAgent("custombot")
launch参数详解
参数名称 | 参数类型 | 参数说明 |
ignoreHTTPSErrors | boolean | 在请求的过程中是否忽略 Https 报错信息,默认为 false |
headless | boolean | 是否以”无头”的模式运行 chrome, 也就是不显示 UI, 默认为 true |
executablePath | string | 可执行文件的路劲,Puppeteer 默认是使用它自带的 chrome webdriver, 如果你想指定一个自己的 webdriver 路径,可以通过这个参数设置 |
slowMo | number | 使 Puppeteer 操作减速,单位是毫秒。如果你想看看 Puppeteer 的整个工作过程,这个参数将非常有用。 |
args | Array(String) | 传递给 chrome 实例的其他参数,比如你可以使用”–ash-host-window-bounds=1024×768” 来设置浏览器窗口大小。更多参数参数列表可以参考这里 |
handleSIGINT | boolean | 是否允许通过进程信号控制 chrome 进程,也就是说是否可以使用 CTRL+C 关闭并退出浏览器. |
timeout | number | 等待 Chrome 实例启动的最长时间。默认为30000(30秒)。如果传入 0 的话则不限制时间 |
dumpio | boolean | 是否将浏览器进程stdout和stderr导入到process.stdout和process.stderr中。默认为false。 |
userDataDir | string | 设置用户数据目录,默认linux 是在 ~/.config 目录,window 默认在 C:\Users{USER}\AppData\Local\Google\Chrome\User Data, 其中 {USER} 代表当前登录的用户名 |
env | Object | 指定对Chromium可见的环境变量。默认为process.env。 |
devtools | boolean | 是否为每个选项卡自动打开DevTools面板, 这个选项只有当 headless 设置为 false 的时候有效 |
Browser 对象 API
方法名称 | 返回值 | 说明 |
browser.close() | Promise | 关闭浏览器 |
browser.disconnect() | void | 断开浏览器连接 |
browser.newPage() | Promise(Page) | 创建一个 Page 实例 |
browser.pages() | Promise(Array(Page)) | 获取所有打开的 Page 实例 |
browser.targets() | Array(Target) | 获取所有活动的 targets |
browser.version() | Promise(String) | 获取浏览器的版本 |
browser.wsEndpoint() | String | 返回浏览器实例的 socket 连接 URL, 可以通过这个 URL 重连接 chrome 实例 |
相关资料:
chrome headless
https://developers.google.cn/web/updates/2017/04/headless-chrome
https://developers.google.com/web/updates/2017/04/headless-chrom
puppeteer
https://github.com/GoogleChrome/puppeteer
https://github.com/GoogleChromeLabs/puppeteer-examples
https://www.npmjs.com/package/puppeteer
chrome金丝雀版
https://www.google.com/chrome/canary/
api
https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md
https://github.com/puppeteer/puppeteer/blob/main/docs/api.md
Puppeteer 入门教程
http://www.r9it.com/20171106/puppeteer.html
无头浏览器Puppeteer初探
https://juejin.im/post/59e5a86c51882578bf185dba
论坛
https://stackoverflow.com/questions/tagged/puppeteer
https://github.com/GoogleChrome/puppeteer/issues
爬虫检测
https://antoinevastel.com/