使用 Node.js 进行网页抓取!
网页抓取:
网络抓取是一种从互联网上收集各种公开数据(例如价格、文本、图片、联系信息等)的方法。对于那些需要花费大量时间手动收集和整理的数据来说,这种方法非常有用。
网络抓取的一些最有用的用例包括:
-
从亚马逊、eBay 或阿里巴巴等电子商务网站上抓取产品价格。
-
抓取社交媒体帖子、点赞、评论、关注者或个人简介。
-
从黄页或 Linkedin 等网站上抓取联系人。
木偶师
虽然有几种不同的库可用于使用 Node.js 抓取网页数据,但在本教程中,我将使用 puppeteer 库。
Puppeteer 是一个流行且易于使用的 npm 包,用于 Web 自动化和 Web 抓取目的。
Puppeteer 的一些最有用的功能包括:
- 能够提取所抓取元素的文本内容。
- 能够通过填写表格、点击按钮或在搜索栏内运行搜索来与网页进行交互。
- 能够从网络上抓取和下载图像。
- 能够使用无头模式查看正在进行的网络抓取。
安装
对于本教程,我假设您已经安装了npm和node_modules,以及package.json和package-lock.json文件。
如果你没有,这里有一个很棒的指南教你如何操作:设置
要安装 puppeteer,请在项目终端中运行以下命令之一:
npm i puppeteer
或者
yarn add puppeteer
一旦安装了 puppeteer,它将作为 node_modules 内的目录出现。
让我们用 Node.js 编写一个简单的网页抓取脚本
网络抓取脚本将通过以下方式从网络词典中获取“smart”的第一个同义词:
让我们开始吧!
在抓取并通过 Node.js 中的选择器提取该元素的文本之前,我们需要先设置一些东西:
创建或打开一个空的 JavaScript 文件,您可以随意命名,但在本教程中,我将命名为“ index.js ”。然后,在第一行引入 puppeteer 并创建异步函数,我们将在其中编写网页抓取代码:
index.js
const puppeteer = require('puppeteer')
async function scrape() {
}
scrape()
接下来,启动一个新的浏览器实例并定义“page”变量,该变量将用于导航到网页并抓取网页 HTML 内容中的元素:
index.js
const puppeteer = require('puppeteer')
async function scrape() {
const browser = await puppeteer.launch({})
const page = await browser.newPage()
}
scrape()
抓取“智能”的第一个同义词
要找到并复制“smart”的第一个同义词的选择器(我们将用它来在网络同义词库的网页中定位该同义词),首先进入网络同义词库的“smart”同义词列表,右键单击第一个同义词,然后点击“检查”。这将使该网页的 DOM 弹出到屏幕右侧:
接下来,右键单击包含第一个同义词的突出显示的 HTML 元素,然后单击“复制选择器”:
最后,导航到网络同义词库,通过我们之前复制的选择器抓取并显示“smart”的第一个同义词:
-
首先,让“page”变量在新创建的浏览器实例中导航到https://www.thesaurus.com/browse/smart 。
-
接下来,我们通过让页面等待我们想要的元素的选择器出现在网页的 DOM 中来定义“元素”变量。
-
然后使用evaluate()函数提取元素的文本内容,并将其显示在“text”变量中。
-
最后,我们关闭浏览器实例。
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()
测试时间
现在,如果您使用“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()
第一次迭代中, “ 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()”内的值来轻松地按顺序抓取它们:
-
li:nth-child(1) 表示第一个同义词。
-
li:nth-child(2) 表示第二个同义词。
-
li:nth-child(3) 表示第三个同义词。
-
li:nth-child(4) 表示第四个同义词。
-
li:nth-child(5) 表示第五个同义词。
最后说明
虽然网页抓取有很多优点,例如:
-
节省手动收集数据的时间。
-
能够以编程方式聚合从网络上抓取的数据。
-
创建可能对机器学习、数据可视化或数据分析目的有用的数据集。
它也有两个缺点:
-
有些网站不允许抓取其数据,一个常见的例子是 craigslist。
-
有些人认为这是一个灰色地带,因为一些网络抓取实践用例涉及用户或实体数据的收集和存储。
总结
希望本文能让您对 Node.js 中的网页抓取、它的实际应用、优缺点以及如何使用 puppeteer 库从网页中提取特定元素及其文本内容有所了解。
文章来源:https://dev.to/code_jedi/web-scraping-in-nodejs-2lkf