使用 Node.js 进行网页抓取!

2025-05-24

使用 Node.js 进行网页抓取!

网页抓取:

网络抓取是一种从互联网上收集各种公开数据(例如价格、文本、图片、联系信息等)的方法。对于那些需要花费大量时间手动收集和整理的数据来说,这种方法非常有用。

网络抓取的一些最有用的用例包括:

  1. 从亚马逊、eBay 或阿里巴巴等电子商务网站上抓取产品价格。

  2. 抓取社交媒体帖子、点赞、评论、关注者或个人简介。

  3. 从黄页或 Linkedin 等网站上抓取联系人。

木偶师

虽然有几种不同的库可用于使用 Node.js 抓取网页数据,但在本教程中,我将使用 puppeteer 库。

Puppeteer 是一个流行且易于使用的 npm 包,用于 Web 自动化和 Web 抓取目的。

Puppeteer 的一些最有用的功能包括:

  1. 能够提取所抓取元素的文本内容。
  2. 能够通过填写表格、点击按钮或在搜索栏内运行搜索来与网页进行交互。
  3. 能够从网络上抓取和下载图像。
  4. 能够使用无头模式查看正在进行的网络抓取。

您可以在此处阅读有关木偶师的更多信息

安装

对于本教程,我假设您已经安装了npmnode_modules,以及package.jsonpackage-lock.json文件。

如果你没有,这里有一个很棒的指南教你如何操作:设置

要安装 puppeteer,请在项目终端中运行以下命令之一:

npm i puppeteer

或者

yarn add puppeteer

一旦安装了 puppeteer,它将作为 node_modules 内的目录出现。

让我们用 Node.js 编写一个简单的网页抓取脚本

网络抓取脚本将通过以下方式从网络词典中获取“smart”的第一个同义词:

  1. 获取网络词典网页的 HTML 内容。

  2. 通过选择器找到我们想要抓取的元素。

  3. 显示抓取元素的文本内容。
    刮擦

让我们开始吧!

在抓取并通过 Node.js 中的选择器提取该元素的文本之前,我们需要先设置一些东西:

创建或打开一个空的 JavaScript 文件,您可以随意命名,但在本教程中,我将命名为“ index.js ”。然后,在第一行引入 puppeteer 并创建异步函数,我们将在其中编写网页抓取代码:

index.js

const puppeteer = require('puppeteer')

async function scrape() {
}
scrape()
Enter fullscreen mode Exit fullscreen mode

接下来,启动一个新的浏览器实例并定义“page”变量,该变量将用于导航到网页并抓取网页 HTML 内容中的元素:

index.js

const puppeteer = require('puppeteer')

async function scrape() {
   const browser = await puppeteer.launch({})
   const page = await browser.newPage()
}
scrape()
Enter fullscreen mode Exit fullscreen mode

抓取“智能”的第一个同义词

要找到并复制“smart”的第一个同义词的选择器(我们将用它来在网络同义词库的网页中定位该同义词),首先进入网络同义词库的“smart”同义词列表,右键单击第一个同义词,然后点击“检查”。这将使该网页的 DOM 弹出到屏幕右侧:
检查

接下来,右键单击包含第一个同义词的突出显示的 HTML 元素,然后单击“复制选择器”:
复制选择器

最后,导航到网络同义词库,通过我们之前复制的选择器抓取并显示“smart”的第一个同义词:

  1. 首先,让“page”变量在新创建的浏览器实例中导航到https://www.thesaurus.com/browse/smart 。

  2. 接下来,我们通过让页面等待我们想要的元素的选择器出现在网页的 DOM 中来定义“元素”变量。

  3. 然后使用evaluate()函数提取元素的文本内容,并将其显示在“text”变量中。

  4. 最后,我们关闭浏览器实例。

index.js

const puppeteer = require('puppeteer')

async function scrape() {
   const browser = await puppeteer.launch({})
   const page = await browser.newPage()

   await page.goto('https://www.thesaurus.com/browse/smart')
   var element = await page.waitForSelector("#meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(1) > a")
   var text = await page.evaluate(element => element.textContent, element)
   console.log(text)
   browser.close()
}
scrape()
Enter fullscreen mode Exit fullscreen mode

测试时间

现在,如果您使用“node index.js”运行index.js脚本,您将看到它显示了单词“smart”的第一个同义词:
测试

找出“smart”的前 5 个同义词

我们可以实现相同的代码来抓取 smart 的前 5 个同义词,而不是 1 个:

index.js

const puppeteer = require('puppeteer')

async function scrape() {
   const browser = await puppeteer.launch({})
   const page = await browser.newPage()

   await page.goto('https://www.thesaurus.com/browse/smart')
   for(i = 1; i < 6; i++){
    var element = await page.waitForSelector("#meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(" + i + ") > a")
    var text = await page.evaluate(element => element.textContent, element)
    console.log(text)
   }
   browser.close()
}
scrape()
Enter fullscreen mode Exit fullscreen mode

5个同义词

第一次迭代中, “ element ”变量将为:“ #meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(1) > a ”,第二次迭代中将为:“ #meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(2) > a ”,依此类推,直到最后一次迭代中,“ element ”变量将为:“ #meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(5) > a ”。

如您所见,在整个迭代过程中,“元素”变量中唯一改变的是“li:nth-​​child()”值。

这是因为在我们的例子中,我们尝试抓取的元素都是“ul”元素内的“li”元素,

因此我们可以通过增加“li:nth-child()”内的值来轻松地按顺序抓取它们:

  1. li:nth-child(1) 表示第一个同义词。

  2. li:nth-child(2) 表示第二个同义词。

  3. li:nth-child(3) 表示第三个同义词。

  4. li:nth-child(4) 表示第四个同义词。

  5. li:nth-child(5) 表示第五个同义词。

最后说明

虽然网页抓取有很多优点,例如:

  1. 节省手动收集数据的时间。

  2. 能够以编程方式聚合从网络上抓取的数据。

  3. 创建可能对机器学习、数据可视化或数据分析目的有用的数据集。

它也有两个缺点:

  1. 有些网站不允许抓取其数据,一个常见的例子是 craigslist。

  2. 有些人认为这是一个灰色地带,因为一些网络抓取实践用例涉及用户或实体数据的收集和存储。

总结

希望本文能让您对 Node.js 中的网页抓取、它的实际应用、优缺点以及如何使用 puppeteer 库从网页中提取特定元素及其文本内容有所了解。

文章来源:https://dev.to/code_jedi/web-scraping-in-nodejs-2lkf
PREV
使用 HTML、CSS 和 javaScript 的图像滑块
NEXT
全栈开发人员词汇表(完整列表!)第 1 部分:基础知识第 2 部分:更高级的部分第 3 部分:语言、工具和框架