作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠。 Show 介绍网络抓取是从网络自动收集数据的过程。该过程通常会部署一个“爬虫”,它会自动浏览网页并从选定页面中抓取数据。您可能想要抓取数据的原因有很多。首先,它通过消除手动数据收集过程使数据收集速度更快。当需要或需要数据收集但网站不提供 API 时,抓取也是一种解决方案。 在本教程中,您将使用Node.js和Puppeteer构建一个 Web 抓取应用程序。随着您的进步,您的应用程序将变得越来越复杂。首先,您将编写应用程序以打开Chromium并加载一个设计为网络抓取沙箱的特殊网站:books.toscrape.com。在接下来的两个步骤中,您将在 books.toscrape 的单个页面上抓取所有书籍,然后在多个页面上抓取所有书籍。在剩余的步骤中,您将按图书类别过滤抓取,然后将数据保存为 JSON 文件。 警告:网络抓取的道德和合法性非常复杂且不断发展。它们还因您的位置、数据位置和相关网站而异。本教程抓取了一个特殊的网站,books.toscrape.com,该网站专门设计用于测试刮刀应用程序。抓取任何其他域不在本教程的范围内。 先决条件
第 1 步 – 设置网络爬虫安装 Node.js 后,您可以开始设置您的网络爬虫。首先,您将创建一个项目根目录,然后安装所需的依赖项。本教程只需要一个依赖项,您将使用 Node.js 的默认包管理器npm安装它。npm 预装了 Node.js,所以你不需要安装它。 为这个项目创建一个文件夹,然后移动到里面:
您将从该目录运行所有后续命令。 我们需要使用 npm 或节点包管理器安装一个包。首先初始化 npm 以创建一个 为您的项目初始化 npm:
npm
将显示一系列提示。您可以按 您的输出将如下所示:
键入 现在使用 npm 安装 Puppeteer:
此命令会安装 Puppeteer 和 Puppeteer 团队知道将与他们的 API 一起使用的 Chromium 版本。 在 Linux 机器上,Puppeteer 可能需要一些额外的依赖项。 如果您使用的是 Ubuntu 18.04,请检查 Puppeteer 的故障排除文档的“Chrome headless 无法在 UNIX 上启动”部分中的“Debian 依赖项”下拉列表。您可以使用以下命令来帮助查找任何缺失的依赖项:
安装 npm、Puppeteer 和任何其他依赖项后,您的 在您首选的文本编辑器中打开文件:
找到该
您还会注意到 您现在已准备好开始编写刮板。在下一步中,您将设置浏览器实例并测试刮刀的基本功能。 步骤 2 — 设置浏览器实例当您打开传统浏览器时,您可以执行诸如单击按钮、使用鼠标导航、键入、打开开发工具等操作。像 Chromium 这样的无头浏览器可以让你做同样的事情,但是以编程方式并且没有用户界面。在这一步中,您将设置刮刀的浏览器实例。当您启动应用程序时,它会自动打开 Chromium 并导航到 books.toscrape.com。这些初始操作将构成您的程序的基础。 您的网站刮板将需要四个 从项目的根目录中,创建并
首先,您将 ./book-scraper/browser.js
Puppeteer
有一个 您正在使用 请注意,该
保存并关闭文件。 现在创建您的第二个
在这里你会 ./book-scraper/index.js
保存并关闭文件。 创建您的第三个
./book-scraper/pageController.js
此代码导出一个函数,该函数接受浏览器实例并将其传递给名为
的函数 保存并关闭文件。 最后,创建您的最后一个
在这里,您将创建一个带有 ./book-scraper/pageScraper.js
Puppeteer
有一个 保存并关闭文件。 您的程序的文件结构现已完成。项目目录树的第一级将如下所示:
现在运行命令
它将自动打开一个 Chromium 浏览器实例,在浏览器中打开一个新页面,然后导航到 books.toscrape.com。 在这一步中,您创建了一个 Puppeteer 应用程序,该应用程序打开 Chromium 并加载了一个虚拟在线书店的主页——books.toscrape.com。在下一步中,您将抓取该主页上每本书的数据。 第 3 步 — 从单个页面中抓取数据在向您的抓取应用程序添加更多功能之前,打开您首选的 Web 浏览器并手动导航到书籍以抓取主页。浏览网站并了解数据的结构。 您会在左侧找到类别部分,右侧显示书籍。当您单击一本书时,浏览器会导航到一个新 URL,该 URL 显示有关该特定书籍的相关信息。 在这一步中,您将复制此行为,但使用代码;您将自动化浏览网站和使用其数据的业务。 首先,如果您使用浏览器中的开发工具检查主页的源代码,您会注意到该页面在 您将抓取这些图书 URL,过滤有库存的图书,导航到每个单独的图书页面,并抓取该图书的数据。 重新打开您的
添加以下突出显示的内容。你将 ./book-scraper/pageScraper.js
在此代码块中,您调用了 每本书都有两种状态;一本书是 保存并关闭文件。 重新运行您的应用程序:
浏览器将打开,导航到网页,然后在任务完成后关闭。现在检查你的控制台;它将包含所有抓取的 URL:
这是一个很好的开始,但您想要抓取特定书籍的所有相关数据,而不仅仅是其 URL。您现在将使用这些 URL 打开每一页并抓取图书的标题、作者、价格、可用性、UPC、描述和图像 URL。 重新开放
添加以下代码,它将循环遍历每个抓取的链接,打开一个新的页面实例,然后检索相关数据: ./book-scraper/pageScraper.js
您有一个包含所有 URL 的数组。您希望遍历此数组,在新页面中打开 URL,在该页面上抓取数据,关闭该页面,然后为数组中的下一个 URL 打开一个新页面。请注意,您将此代码包装在 Promise 中。这是因为您希望能够等待循环中的每个操作完成。因此,每个 Promise 都会打开一个新的 URL,并且在程序抓取 URL 上的所有数据之前不会解析,然后该页面实例关闭。 警告:请注意,您使用 仔细看看你的 保存并关闭文件。 再次运行脚本:
浏览器打开主页,然后打开每个书页并记录从每个页面中抓取的数据。此输出将打印到您的控制台:
在这一步中,您在 books.toscrape.com 的主页上抓取了每本书的相关数据,但您可以添加更多功能。例如,每一页书都有分页;你如何从这些其他页面获取书籍?此外,在网站的左侧,您可以找到书籍类别;如果您不想要所有的书,而只想要特定类型的书怎么办?您现在将添加这些功能。 第 4 步 – 从多个页面抓取数据book.toscrape.com 上分页的 您将使用此按钮的存在来确定页面是否已分页。由于每个页面上的数据具有相同的结构并具有相同的标记,因此您不会为每个可能的页面编写一个抓取工具。相反,您将使用递归的做法。 首先,您需要稍微更改代码结构以适应递归导航到多个页面。 重新开放
您将添加一个新函数调用 ./book-scraper/pageScraper.js 刮刀()
您 如果 保存并关闭文件。 再次运行你的脚本:
这可能需要一段时间才能完成;毕竟,您的应用程序现在正在从 800 多本书中抓取数据。随意关闭浏览器或按 您现在已经最大限度地发挥了刮板的功能,但在此过程中又产生了一个新问题。现在的问题不是数据太少,而是数据太多。在下一步中,您将微调您的应用程序以按书籍类别过滤您的抓取。 第 5 步 — 按类别抓取数据要按类别抓取数据,您需要修改
调用刮刀,使其只刮旅行书。添加以下代码: ./book-scraper/pageController.js
您现在将两个参数传递到您的 保存并关闭文件。 打开
添加以下代码,这将添加您的类别参数,导航到该类别页面,然后开始抓取分页结果: ./book-scraper/pageScraper.js
此代码块使用您传入的类别来获取该类别图书所在的 URL。 所述 示例 page.$$eval() 函数
这就是您在代码中所做的;您传递了要抓取的书籍类别,映射所有类别以检查哪一个匹配,然后返回该类别的 URL。 然后使用此 URL 导航到显示您要使用该 保存并关闭文件。 再次运行您的应用程序。您会注意到它导航到该
在此步骤中,您跨多个页面抓取数据,然后跨多个页面抓取来自一个特定类别的数据。在最后一步中,您将修改脚本以跨多个类别抓取数据,然后将此抓取的数据保存到字符串化的 JSON 文件中。 第 6 步 – 从多个类别中抓取数据并将数据保存为 JSON在这最后一步中,您将使脚本根据需要从任意数量的类别中刮取数据,然后更改输出方式。不是记录结果,而是将它们保存在一个名为 您可以快速添加更多类别进行抓取;这样做每个流派只需要一个额外的行。 打开
调整您的代码以包含其他类别。下面的示例将 ./book-scraper/pageController.js
保存并关闭文件。 再次运行脚本并观察它抓取所有三个类别的数据:
随着刮刀功能齐全,您的最后一步涉及以更有用的格式保存数据。您现在将使用Node.js 中的 首先,重新打开
添加以下突出显示的代码: ./book-scraper/pageController.js
First, you are requiring Node,js’s Save and close the file. You have now built a web-scraping application that scrapes books across multiple categories and then stores your scraped data in a JSON file. As your application grows in complexity, you might want to store this scraped data in a database or serve it over an API. How this data is consumed is really up to you. Conclusion在本教程中,您构建了一个网络爬虫,它以递归方式跨多个页面抓取数据,然后将其保存在 JSON 文件中。简而言之,您学到了一种从网站自动收集数据的新方法。 Puppeteer 有很多不在本教程范围内的功能。要了解更多信息,请查看使用 Puppeteer 轻松控制 Headless Chrome。您还可以访问Puppeteer 的官方文档。 |