<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。
读了一下源码之后,可以这么解决:
- 安装 Puppeteer,安装失败,提示无法下载
https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/588429/chrome-win32.zip
- 使用
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 npm install puppeteer --save-dev
成功安装 Puppeteer - 执行
node test.js
提示无法找到 Chromium - 手动下载步骤 1 中的
chrome-win32.zip
,注意不同版本、不同系统的下载地址是不一样的 - 开启一个静态文件服务,使得
http://127.0.0.1:8000/chrome-win32.zip
指向需要下载的文件 - 改写
downloadURL
方法,使其直接返回http://127.0.0.1:8000/chrome-win32.zip
- 执行
node ./node_modules/puppeteer/install.js
完成安装 - 执行
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 事件回调中,表示调用弹窗后的对象,包括 alert , beforeunload , confirm 和 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: 页面发出的请求
相关推荐
标签中提到了“爬虫”、“python”和“毕业设计”,这说明项目是使用 Python 编程语言编写的,因为 Puppeteer 虽然是基于 Node.js 的,但通常在 Python 中可以通过第三方库如 `puppeteer-python` 来调用。...
- `package.json`:项目配置文件,记录了项目的依赖和元数据。 - `index.js`:主入口文件,包含了`site-scan`的逻辑代码。 - `README.md`:项目说明文档,解释如何使用和配置`site-scan`。 - `LICENSE`:项目...
通过Puppeteer,定时爬取被监视站点,如果有异常则保存截图至/ data / err 创建一个后台服务器,为定时脚本提供API,记录成功或失败的情况 server提供api,可以查询所有的监控记录 运行说明 1. PuppeteerJS:定时...
在实际的 `puppeteer-sample-master` 项目中,你可以期待看到以上这些功能的综合运用,以及可能的错误处理和日志记录。学习这个示例可以帮助你理解 Puppeteer 的工作方式,并快速上手使用它来解决实际问题。
本框架可能利用了如Scrapy-Redis或Puppeteer Cluster等分布式爬虫技术,实现了任务调度和结果汇总。 5. **项目说明与部署**:压缩包内的项目说明文档详细阐述了爬虫框架的结构、使用方法及部署步骤,帮助用户快速...
以下是一些核心知识点的详细说明: 1. **网络请求库**:Java爬虫通常依赖于HTTP请求库,如Apache HttpClient或OkHttp,用于向目标网站发送GET或POST请求,获取网页内容。这些库提供了设置请求头、管理cookies和处理...
设计说明书是理解系统架构和功能的重要文档,"客户提款 银行转账自助执行系统_设计说明书.doc"中应该详细描述了系统的模块划分、数据流、接口设计以及安全性考虑。通常包括以下几个方面: 1. 用户界面:提供简洁...
标题 "Node.js-Nodejs的简化HTMLCSS->PDF生成器" 指向的是一个使用Node.js技术来将HTML和CSS内容转换为PDF文件的工具或库。在Node.js环境中,这种...用户可以解压文件,按照里面的说明进行学习和实践,以掌握这一技术。
Selenium、Puppeteer(Python的playwright库)等工具能够模拟浏览器行为,动态执行JavaScript,抓取到完整页面内容。 五、登录验证与Session管理 部分网站需要登录后才能访问某些数据,Python可以通过requests库...
2. **数据存储**:"taobao.mdb"是一个Access数据库文件,可能用于存储用户的账号信息、领取记录等数据,确保软件在操作时能够正确识别用户身份并记录领取情况。 3. **依赖库**:"Newtonsoft.Json.dll"是.NET框架下...
描述中的“jd爬虫,用于自动查询及下单购买商品,仅供测试学习,不负任何责任”说明了该程序的主要功能:自动化查询商品库存并执行购买操作。同时,它明确指出是测试和学习用途,意味着这个代码可能不适用于商业环境...
2. **playwright-extra**:增加了一些额外的功能,如记录网络请求、模拟地理位置、性能指标等。 3. **playwright-github-action**:将 Playwright 集成到 GitHub Actions 工作流中,便于持续集成和自动化测试。 ...
3. **文件处理与压缩**:压缩包中的"内容来自存起来软件站www.cqlsoft.com.txt"可能是项目来源的记录或者使用说明。在处理这类文本文件时,开发者可能使用了如Python的os、shutil模块,或者JavaScript的fs模块来进行...
以下是对这个Java爬虫项目及其相关知识点的详细说明: 1. **Java爬虫基础**:Java爬虫主要是通过HTTP/HTTPS协议与服务器交互,获取HTML或其他格式的网页内容。常用库有Jsoup、Apache HttpClient、Jsoup和HtmlUnit等...
在实际应用中,这个工具可能被集成到自动化脚本或者持续集成/持续部署(CI/CD)流程中,用于生成网页截图,以便检查设计的一致性或者记录每次部署后的页面状态。 然而,由于提供的压缩包子文件的文件名称列表只包含...
通常,模拟浏览器操作(如使用Selenium或Puppeteer)会打开一个真实的浏览器实例来执行JavaScript,获取动态加载的数据。然而,这种方式在处理大量请求时效率较低,且可能因过于频繁的访问而触发网站的反爬机制。...
9. **点赞和收藏数统计**:对于每个作品,工具会计算并记录其点赞数和收藏数,反映其受欢迎程度。 在实际使用中,你需要根据"说明.txt"提供的文档来安装依赖、配置参数、运行脚本。由于小红书的反爬策略不断更新,...
3. **JavaScript渲染**:很多网站使用AJAX动态加载,可能需要如Selenium或Puppeteer来模拟浏览器执行JS。 4. **登录与授权**:爬虫可能需要模拟用户登录,处理cookies和session,以访问需要登录后才能看到的数据。 5...
2. `package.json`: 项目配置文件,记录了依赖的npm模块及其版本,以及可能的脚本命令。 3. `node_modules/`: 项目的依赖库,包括JavaScript的网络请求库、HTML解析库等。 4. `.gitignore`: 定义了版本控制系统忽略...
描述中的"现在您可以从命令行安装Optic npm install optic-installer -g"说明Optic Installer是一个可以通过Node Package Manager(npm)全局安装的工具。`npm install optic-installer -g`这条命令意味着开发者可以...