安装
步骤一:新建目录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/

作者 铁血 汉子 2018年9月28日
2024/12/03/05:11:20pm 2018/9/28/8:50:25
0 2431