`

Puppeteer 说明记录

 
阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

 

无头浏览器 通过写脚本来使用无头浏览器访问网站。通过一系列的api 和无头浏览器界面进行交互。

 

安装 Puppeteer

先创建一个测试用的项目,执行 npm init 初始化好 package.json,然后执行以下命令安装 Puppeteer:

npm install puppeteer --save-dev

万事开头难,第一步安装时就会遇到问题(如果没有报错,请跳过这一段)。

Puppeteer 安装过程中会去下载 Chromium,墙内用户则会报错。如果你看到以下信息,说明是下载 Chromium 时连接不上。

ERROR: Failed to download Chromium r588429! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
Error: Download failed: server returned code 502. URL: https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/588429/chrome-win32.zip

或者

ERROR: Failed to download Chromium r588429! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
{ Error: connect ETIMEDOUT 172.217.24.48:443

如提示所说,设置 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 可以跳过安装 Chromium。

PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 npm install puppeteer --save-dev

此时可以安装成功,但是使用 Puppeteer 时会由于找不到 Chromium 而报错。可以创建一个文件 test.js,内容如下:

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();
})();

然后执行 node test.js 则会报错:

$ node test.js
(node:18368) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Chromium revision is not downloaded. Run "npm install" or "yarn install"
(node:18368) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

一个解决方案是先手动下载 Chromium,然后在执行时通过配置指定 Chromium 位置,这篇文章给出了解决步骤。

但是我更倾向于还原 Puppeteer 安装时的过程。但是由于一些环境原因,即便翻-墙了也只能手动下载 Chromium,无法在安装 Puppeteer 时自动下载 Chromium。

读了一下源码之后,可以这么解决:

  1. 安装 Puppeteer,安装失败,提示无法下载 https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/588429/chrome-win32.zip
  2. 使用 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 npm install puppeteer --save-dev 成功安装 Puppeteer
  3. 执行 node test.js 提示无法找到 Chromium
  4. 手动下载步骤 1 中的 chrome-win32.zip,注意不同版本、不同系统的下载地址是不一样的
  5. 开启一个静态文件服务,使得 http://127.0.0.1:8000/chrome-win32.zip 指向需要下载的文件
  6. 改写 downloadURL 方法,使其直接返回 http://127.0.0.1:8000/chrome-win32.zip
  7. 执行 node ./node_modules/puppeteer/install.js 完成安装
  8. 执行 node test.js 测试能否成功生成截图

至此,成功完成了 Puppeteer 的安装。

 

Puppeteer API

Puppeteer 的大部分 API 的返回值都是 Promise,故推荐使用 async await 来处理异步操作。Puppeteer 的 API 包含以下类:

类名 描述
Puppeteer 主要用于创建一个浏览器实例,也可以用来下载新的 Chromium,或者设置浏览器的默认参数
BrowserFetcher 用于下载和管理 Chromium
Browser 可以创建一个或多个 Page
BrowserContext 创建一个隐身模式的浏览器时需要用到
Page 主要 API,用于操作一个页面,后面会详细介绍
Worker 用于处理 WebWorker
Keyboard 可以触发键盘按键
Mouse 可以触发鼠标动作
TouchScreen 可以触发触摸屏的动作
Tracing 用于分析性能
Dialog 存在于 page 的 dialog 事件回调中,表示调用弹窗后的对象,包括 alertbeforeunloadconfirm 和 prompt
ConsoleMessage 存在于 page 的 console 事件回调中,表示调用 console.log 等方法后的对象
Frame 常用于处理包含多个 frame 的页面。page 中的很多方法就是直接调用的主 frame 的方法
ExecutionContext 执行上下文存在于 frame、浏览器插件、worker 中。可以用来直接执行一段 js
JSHandle 通过 page.evaluateHandle 生成,用于将页面中的 handler 挑出来传递使用
ElementHandle 通过 page.$ 生成,用于将页面中某个元素的 handler 挑出来传递使用
Request 在 page.setRequestInterception 方法中使用,可以处理页面的请求
Response 表示页面接收到的响应
SecurityDetails 表示页面的安全信息
Target 可以是 page, background_page, service_worker, browser 等
CDPSession 用于直接和 Devtools 通信
Coverage 用于分析 js 和 css 的代码被页面使用的比例
TimeoutError 超时错误

Page

Page 是 Puppeteer 中最重要的一个 API,也是它的核心所在,这里会介绍一些常用的 Page API。

设置页面环境

方法名 描述
page.emulate 设置 viewport 和 ua
page.setViewport 设置 viewport
page.setUserAgent 设置 ua
page.setRequestInterception 中断所有请求,并可以修改请求的返回值
page.addScriptTag 添加 js 脚本
page.addStyleTag 添加 css
page.setContent 设置整个 html
page.setCacheEnabled 设置缓存是否开启
page.setExtraHTTPHeaders 设置额外的 http 头
page.setGeolocation 设置地理位置
page.setJavaScriptEnabled 设置 js 是否开启
page.setOfflineMode 设置离线模式
page.deleteCookie 删除 cookies
page.setCookie 设置 cookies

 

对象说明

  • Browser: 对应一个浏览器实例,一个 Browser 可以包含多个 BrowserContext
  • BrowserContext: 对应浏览器一个上下文会话,就像我们打开一个普通的 Chrome 之后又打开一个隐身模式的浏览器一样,BrowserContext 具有独立的 Session(cookie 和 cache 独立不共享),一个 BrowserContext 可以包含多个 Page
  • Page:表示一个 Tab 页面,通过 browserContext.newPage()/browser.newPage() 创建,browser.newPage() 创建页面时会使用默认的 BrowserContext,一个 Page 可以包含多个 Frame
  • Frame: 一个框架,每个页面有一个主框架(page.MainFrame()),也可以多个子框架,主要由 iframe 标签创建产生的
  • ExecutionContext: 是 javascript 的执行环境,每一个 Frame 都一个默认的 javascript 执行环境
  • ElementHandle: 对应 DOM 的一个元素节点,通过该该实例可以实现对元素的点击,填写表单等行为,我们可以通过选择器,xPath 等来获取对应的元素
  • JsHandle:对应 DOM 中的 javascript 对象,ElementHandle 继承于 JsHandle,由于我们无法直接操作 DOM 中对象,所以封装成 JsHandle 来实现相关功能
  • CDPSession:可以直接与原生的 CDP 进行通信,通过 session.send 函数直接发消息,通过 session.on 接收消息,可以实现 Puppeteer API 中没有涉及的功能
  • Coverage:获取 JavaScript 和 CSS 代码覆盖率
  • Tracing:抓取性能数据进行分析
  • Response: 页面收到的响应
  • Request: 页面发出的请求

 

分享到:
评论

相关推荐

    基于 puppeteer 的中国行政区域抓取爬虫.zip

    标签中提到了“爬虫”、“python”和“毕业设计”,这说明项目是使用 Python 编程语言编写的,因为 Puppeteer 虽然是基于 Node.js 的,但通常在 Python 中可以通过第三方库如 `puppeteer-python` 来调用。...

    Node.js-site-scan基于puppeteer实现的网站截屏CLI工具

    - `package.json`:项目配置文件,记录了项目的依赖和元数据。 - `index.js`:主入口文件,包含了`site-scan`的逻辑代码。 - `README.md`:项目说明文档,解释如何使用和配置`site-scan`。 - `LICENSE`:项目...

    鹰眼:前端监控:定时监控站点渲染情况,记录异常并保存截图:puppeteer,thinkjs,mongodb,headless-chrome,vuejs

    通过Puppeteer,定时爬取被监视站点,如果有异常则保存截图至/ data / err 创建一个后台服务器,为定时脚本提供API,记录成功或失败的情况 server提供api,可以查询所有的监控记录 运行说明 1. PuppeteerJS:定时...

    puppeteer-sample

    在实际的 `puppeteer-sample-master` 项目中,你可以期待看到以上这些功能的综合运用,以及可能的错误处理和日志记录。学习这个示例可以帮助你理解 Puppeteer 的工作方式,并快速上手使用它来解决实际问题。

    基于规则配置的通用分布式爬虫框架.zip

    本框架可能利用了如Scrapy-Redis或Puppeteer Cluster等分布式爬虫技术,实现了任务调度和结果汇总。 5. **项目说明与部署**:压缩包内的项目说明文档详细阐述了爬虫框架的结构、使用方法及部署步骤,帮助用户快速...

    java爬虫项目实战源码

    以下是一些核心知识点的详细说明: 1. **网络请求库**:Java爬虫通常依赖于HTTP请求库,如Apache HttpClient或OkHttp,用于向目标网站发送GET或POST请求,获取网页内容。这些库提供了设置请求头、管理cookies和处理...

    客户提款 银行转账自助执行系统.zip_网页自动化_银行自助脚本

    设计说明书是理解系统架构和功能的重要文档,"客户提款 银行转账自助执行系统_设计说明书.doc"中应该详细描述了系统的模块划分、数据流、接口设计以及安全性考虑。通常包括以下几个方面: 1. 用户界面:提供简洁...

    Node.js-Nodejs的简化HTMLCSS->PDF生成器

    标题 "Node.js-Nodejs的简化HTMLCSS-&gt;PDF生成器" 指向的是一个使用Node.js技术来将HTML和CSS内容转换为PDF文件的工具或库。在Node.js环境中,这种...用户可以解压文件,按照里面的说明进行学习和实践,以掌握这一技术。

    python068反爬虫技术的研究.zip

    Selenium、Puppeteer(Python的playwright库)等工具能够模拟浏览器行为,动态执行JavaScript,抓取到完整页面内容。 五、登录验证与Session管理 部分网站需要登录后才能访问某些数据,Python可以通过requests库...

    淘宝淘金币工具

    2. **数据存储**:"taobao.mdb"是一个Access数据库文件,可能用于存储用户的账号信息、领取记录等数据,确保软件在操作时能够正确识别用户身份并记录领取情况。 3. **依赖库**:"Newtonsoft.Json.dll"是.NET框架下...

    jdBuyMask_010_full_speed_python_full_

    描述中的“jd爬虫,用于自动查询及下单购买商品,仅供测试学习,不负任何责任”说明了该程序的主要功能:自动化查询商品库存并执行购买操作。同时,它明确指出是测试和学习用途,意味着这个代码可能不适用于商业环境...

    awesome-playwright:使用Playwright的精选工具,实用程序和项目的精选列表

    2. **playwright-extra**:增加了一些额外的功能,如记录网络请求、模拟地理位置、性能指标等。 3. **playwright-github-action**:将 Playwright 集成到 GitHub Actions 工作流中,便于持续集成和自动化测试。 ...

    光线定时自动一键采集 V1.4-源码.zip

    3. **文件处理与压缩**:压缩包中的"内容来自存起来软件站www.cqlsoft.com.txt"可能是项目来源的记录或者使用说明。在处理这类文本文件时,开发者可能使用了如Python的os、shutil模块,或者JavaScript的fs模块来进行...

    java爬虫,以爬取sohu新闻为例

    以下是对这个Java爬虫项目及其相关知识点的详细说明: 1. **Java爬虫基础**:Java爬虫主要是通过HTTP/HTTPS协议与服务器交互,获取HTML或其他格式的网页内容。常用库有Jsoup、Apache HttpClient、Jsoup和HtmlUnit等...

    cobra HTML转图片的jar

    在实际应用中,这个工具可能被集成到自动化脚本或者持续集成/持续部署(CI/CD)流程中,用于生成网页截图,以便检查设计的一致性或者记录每次部署后的页面状态。 然而,由于提供的压缩包子文件的文件名称列表只包含...

    Python-百度指数爬虫可以自定义时间段抓取百度指数非模拟浏览器操作

    通常,模拟浏览器操作(如使用Selenium或Puppeteer)会打开一个真实的浏览器实例来执行JavaScript,获取动态加载的数据。然而,这种方式在处理大量请求时效率较低,且可能因过于频繁的访问而触发网站的反爬机制。...

    Python_小红书链接提取作品采集工具提取账号发布收藏点赞作品链接提取搜索结果作品用户链接采集小红书作品信息提取小红.zip

    9. **点赞和收藏数统计**:对于每个作品,工具会计算并记录其点赞数和收藏数,反映其受欢迎程度。 在实际使用中,你需要根据"说明.txt"提供的文档来安装依赖、配置参数、运行脚本。由于小红书的反爬策略不断更新,...

    sina-weibo-crawler-master.zip

    3. **JavaScript渲染**:很多网站使用AJAX动态加载,可能需要如Selenium或Puppeteer来模拟浏览器执行JS。 4. **登录与授权**:爬虫可能需要模拟用户登录,处理cookies和session,以访问需要登录后才能看到的数据。 5...

    examsscraper

    2. `package.json`: 项目配置文件,记录了依赖的npm模块及其版本,以及可能的脚本命令。 3. `node_modules/`: 项目的依赖库,包括JavaScript的网络请求库、HTML解析库等。 4. `.gitignore`: 定义了版本控制系统忽略...

    optic-installer:[不推荐使用]

    描述中的"现在您可以从命令行安装Optic npm install optic-installer -g"说明Optic Installer是一个可以通过Node Package Manager(npm)全局安装的工具。`npm install optic-installer -g`这条命令意味着开发者可以...

Global site tag (gtag.js) - Google Analytics