使用 Puppeteer 将任何网页变成您的个人 API
在这个由三部分组成的系列文章中,我们将学习如何将任何网页转换为我们自己的 API。我们将以创建一个使用 Google 搜索获取搜索结果的搜索 API 为例进行讲解。所有这些操作都将通过 Web Scraping 来实现,puppeteer
这是一个由 3 部分组成的系列:
- 在第一部分中:我们将介绍基础知识并创建一个简单的 Web Scraper。
- 在第二部分中:我们将使用 Google 搜索创建一个搜索引擎 API。
- 在第三部分中:我们将介绍优化 API、提高性能、故障排除基础知识以及如何将 Puppeteer API 部署到 Web 的不同方法。
目录 - 第 1 部分
Puppeteer 基础知识
我们首先需要了解它puppeteer
是什么以及可以用它做什么。
Puppeteer 到底是什么?
根据官方文档的定义:
Puppeteer 是一个 Node 库,它提供了高级 API,可以通过DevTools 协议控制无头Chrome 或 Chromium 。它也可以配置为使用完整(非无头)的 Chrome 或 Chromium。
简单来说,puppeteer
这是一个允许您以编程方式(又称无头)访问 Chromium 浏览器的库。
无头浏览器非常适合自动化测试和服务器环境,尤其适合那些不需要可见 UI 界面的环境。例如,您可能想针对真实网页运行一些测试,创建 PDF 文件,或者只是检查浏览器如何渲染 URL。
Chrome 浏览器功能强大,功能丰富。Chrome 浏览器能实现的所有功能,在 DevTools 中都能实现。您可以点击此处puppeteer
了解更多关于 DevTools 的功能。
以下是一些用例puppeteer
:
- 生成页面的屏幕截图和 PDF。
- 爬取一个SPA(单页应用程序)并生成预渲染的内容(即“SSR”(服务器端渲染))。
- 自动化表单提交、UI 测试、键盘输入等。
- 创建最新的自动化测试环境。使用最新的 JavaScript 和浏览器功能,直接在最新版本的 Chrome 中运行测试。
- 捕获站点的时间线跟踪以帮助诊断性能问题。
- 测试 Chrome 扩展程序。
然而,在这篇文章中,我们将专门使用它puppeteer
来进行网络抓取。
创建一个简单的 Puppeteer Scraper
首先,我们需要初始化一个目录,然后使用命令行初始化 npm(或 yarn):
mkdir hello-puppeteer
cd hello-puppeteer
npm init -y
然后我们可以安装该puppeteer
库:
npm i puppeteer
为了确保该库在所有设备上都能正常工作,Chromium 浏览器内置了该库。这确保了库的正常运行,并避免了用户自行配置路径和/或下载/安装 Chrome。
该库下载了最新版本的 Chromium(~170MB Mac、~282MB Linux、~280MB Win),保证可以与 API 一起使用。
对于那些感兴趣的人,该puppeteer
团队目前还正在开发一个实验版本,将 Puppeteer 引入Firefox。
由于它puppeteer
是一个 Node.js 库,我们需要创建一个 node.js 文件并使用 node 运行它。为了方便起见,我们将其命名为server.js
:
touch server.js
要启动我们的 API,我们需要配置package.json
文件,以便 Node 能够运行我们的服务器文件。我们可以通过npm start
在以下位置添加脚本来实现scripts
:
{
"name": "hello-puppeteer",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"puppeteer": "^2.0.0"
}
}
现在我们准备编写代码来在我们的server.js
文件中创建一个简单的抓取工具:
const puppeteer = require('puppeteer');
(async () => {
//Creates a Headless Browser Instance in the Background
const browser = await puppeteer.launch();
//Creates a Page Instance, similar to creating a new Tab
const page = await browser.newPage();
//Navigate the page to url
await page.goto('https://example.com');
//Closes the Browser Instance
await browser.close();
})();
这段代码创建了一个匿名函数,当我们运行 时就会执行npm start
。它会创建一个浏览器实例,其中包含一个新页面并导航到https://example.com
。之后,它会关闭浏览器实例,Node 也就完成了文件的执行。
为了确保其按预期工作,我们可以在puppeteer
完成导航到该页面后截取该页面的屏幕截图:
page.screenshot({path: 'example.png'});
将其添加到我们的文件后:
const puppeteer = require('puppeteer');
(async () => {
//Creates a Headless Browser Instance in the Background
const browser = await puppeteer.launch();
//Creates a Page Instance, similar to creating a new Tab
const page = await browser.newPage();
//Navigate the page to url
await page.goto('https://example.com');
//Takes a screenshot of the page after navigating there and saves it as 'example.png'
await page.screenshot({path: 'example.png'});
//Closes the Browser Instance
await browser.close();
})();
我们可以https://example.com
用一个有效的 URL 来替换。在本例中,我们将使用https://google.com
。现在我们可以运行npm start
,过一会儿,我们就可以example.png
在文件目录中看到 ,打开它就会显示 的主页Google
。
我们简单的网页爬虫就快完成了。现在我们可以选择从 Google 主页获取任何我们想要的信息。目前,我们只获取 Google 主页 Logo 的图片来源。
这本身并没有什么目的。然而,关键是我们可以通过编程来访问这些信息。
为此,我们需要打开浏览器,导航到 URL,并通过“检查元素”功能找到我们要查找的元素。您可以右键单击页面,然后选择“检查”,或者直接打开 Dev-Tools,导航到 HTML(元素选项卡)。
使用鼠标工具突出显示徽标元素后,它指向的内容如下(这对您来说可能有所不同):
需要查找的是任何能够识别 HTML 元素的信息。在我们的例子中,img
元素有一个 id hplogo
。因此,我们可以使用此信息来访问图像源。
有很多不同的方法可以从 DOM/页面获取特定元素。
为了定位单个元素,我们可以使用方法,$eval
其中我们用名称或我们正在寻找的元素的任何标识属性替换为参数。id
class
selector
page.$eval(selector, callbackFunc);
此方法
document.querySelector
在元素内运行,并将其作为第一个参数传递给callbackFunc。如果没有匹配的元素selector
,则该方法将抛出错误。
为了定位多个元素,我们可以使用:
page.$$eval(selector, callbackFunc);
此方法
document.querySelectorAll
在元素内运行,并将其作为第一个参数传递给callbackFunc。如果没有匹配的元素selector
,则该方法将抛出错误。
如果找到该元素,它将作为第一个参数传递给回调函数,因此我们可以使用它来获取所需的信息。
const googleLogo = await page.$eval('#hplogo', (img) => img.src);
元素的定位类似于 CSS 或 Javascript 选择器中的定位
在我们的例子中,由于我们只需要获取单个图像,因此我们可以直接使用$eval
和访问src
:
const puppeteer = require('puppeteer');
(async () => {
//Creates a Headless Browser Instance in the Background
const browser = await puppeteer.launch();
//Creates a Page Instance, similar to creating a new Tab
const page = await browser.newPage();
//Navigate the page to url
await page.goto('https://google.com');
//Takes screenshot of the page after navigating there
await page.screenshot({path: 'example.png'});
//Finds the first element with the id 'hplogo' and returns the source attribute of that element
const googleLogo = await page.$eval('#hplogo', img => img.src);
console.log(googleLogo);
//Closes the Browser Instance
await browser.close();
})();
运行后npm start
,服务器console.logs:
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
如果我们在浏览器标签页中打开这个 URL,就会发现它就是我们要找的图片!我们简单的网页爬虫就完成了!
这个简单的网络爬虫的代码可以在Github上找到
在下一部分中,我们将使用 Google 搜索创建一个搜索引擎 API。用户可以通过搜索查询请求我们的 API。我们的 API 会抓取 Google 数据并返回前 10 个搜索结果。
第一部分到此结束。希望你喜欢这篇文章,敬请期待第二部分!欢迎大家提供反馈!
文章来源:https://dev.to/waqasabbasi/turn-any-webpage-into-your-personal-api-with-puppeteer-4a6