用于网络抓取的 5 大 JavaScript 库

罗伯特-斯菲奇(Robert Sfichi),2021 年 4 月 3 日

随着计算机时代的发展,人们开发出了许多有用的技术,可以创建巨大的数据集。数据科学家、统计学家、计算机科学家和软件开发人员最常使用的技术之一就是网络搜刮,用于收集有关特定问题的宝贵见解。

使用各种工具(如 API、浏览器扩展、框架等)可以以多种方式完成网络刮擦技术。但本文的重点是最后一类工具。

作为开发软件最常用的编程语言之一,JavaScript 有很多库可以在收集所需数据的过程中提供帮助。

为此,我们向您推荐 5 个在网络刮擦方面最有用的 JavaScript 库。

网络搜索简介

顾名思义,网络搜刮器是一种在提取数据(如特定字符串、数字或附件)过程中抓取不同网页的软件。

你可以把它看作是将网页上的信息复制并粘贴到电子表格中的一种更好的替代方法。与其这样做,不如由计算机程序来帮你完成。这样做更快,可能也更精确。很显然,如果没有它,我们就必须做更多的工作才能得到同样的结果。

网络搜刮使用案例

人们出于各种原因使用网络刮擦工具。最常见的使用案例有

  • 潜在客户生成
  • 价格比较
  • 市场分析
  • 学术研究
  • 搜索引擎优化审计和关键词搜索
  • 为机器学习流程创建训练和测试数据集

电子商务企业可能会使用网络搜刮工具来收集竞争对手撰写的有关产品照片、功能或描述的信息,以便更好地了解市场。

GPT-3被认为是目前市场上最强大的软件工具之一。机器学习脚本在获得大量数据后才能发挥最大作用。然而,这可能需要数小时甚至数天的时间。数据科学家可以利用网络刮擦工具提供的帮助来收集他们所需的所有数据集,以便训练机器学习模型。

准备工作空间

要使用以下库,您必须确保机器上已安装 Node.js。请在新终端窗口中运行以下命令进行检查:

node -v

如果您已安装 Node.js,您应该会看到版本出现在下一行。它看起来像这样

v14.15.0

如果您已收到 Node.js 安装确认,请跳转到下一部分。如果您之前没有安装过 Node.js,现在就让我们来看看安装过程。

首先,访问Node.js 网站并获取最新版本(在撰写本文时为 14.16.0)。点击 "推荐大多数用户使用 "按钮,等待下载完成。下载完成后启动安装程序。

安装完成后,您可以在新的终端窗口中运行以下命令,检查 Node.js 的版本:

node -v

几秒钟后,您将看到已安装的 Node.js 版本。

用于网络搜索的 5 大 JavaScript 工具

阿克西奥斯

Axios是最流行的 JavaScript 库之一,用于直接从 Node.js 环境发出 HTTP 请求。使用 Axios,我们还可以轻松下载数据,同时无需将 HTTP 请求的结果传递给 .json() 方法。毋庸置疑,Axios 是一款非常强大的网络搜刮工具。

要安装 Axios,请在项目文件夹中运行以下命令:

npm i axios

通过使用下一个库,我们将更清楚地展示 Axios 的强大功能。

噩梦

创建Nightmare的初衷是帮助用户在没有 API 的网站上自动执行不同的任务。

目前,大多数人在尝试从网页中抓取数据时,都会使用它来创建更逼真的请求。通过使用它的核心功能,我们可以使用 API 来模仿用户的操作,让每个脚本块都感觉是同步的。

让我们来看一个现实世界中的例子,看看有人如何使用 Nightmare 进行网络搜刮。

由于它使用的是 Electron 而不是 Chromium,因此捆绑包的大小要小一些。运行以下命令即可安装 Nightmare。

npm i 噩梦

我们将尝试截取一个随机网页的截图。创建一个新的index.js文件,然后键入或复制以下代码:

const Nightmare = require('nightmare')

const nightmare = new Nightmare()
return nightmare.goto('https://www.old.reddit.com/r/learnprogramming')
.screenshot('./screenshot.png')
.end()
.then(() => {
console.log('Done!')
})
.catch((err) => {
console.error(err)
})

如第 2 行所示,我们创建了一个新的 Nightmare 实例,将浏览器指向要截图的网页,在第 5 行截图并保存,然后在第 6 行结束 Nightmare 会话。

要运行它,请在终端中键入以下命令并按回车键。

node index.js

你应该会在项目文件夹中看到两个新文件screenshot.png

加油

为了测试Cheerio 的功能,让我们尝试收集同一子论坛上的所有帖子标题:/r/learnprogramming。

让我们创建一个名为 index.js 的新文件,然后键入或直接复制以下几行:

const axios = require("axios");
const cheerio = require("cheerio");

const fetchTitles = async () => {
try {
const response = await axios.get('https://old.reddit.com/r/learnprogramming/');

const html = response.data;

const $ = cheerio.load(html);

const titles = [];

$('div > p.title > a').each((_idx, el) => {
const title = $(el).text()
titles.push(title)
});

return titles;
} catch (error) {
throw error;
}
};

fetchTitles().then((titles) => console.log(titles));

我们可以看到,Cheerio 实现了核心 jQuery 的一个子集。为了确保我们只选择包含文章标题的锚标签,我们还将在第 15 行使用以下选择器来选择它们的父标签。

为了单独获取每篇文章的标题,我们将使用 each()函数对每篇文章进行循环。最后,在每个项目上调用text()将返回特定帖子的标题。

要运行它,只需在终端中键入以下命令并按回车键。

node index.js

你会看到一个包含所有帖子标题的数组。

木偶师

Puppeteer可帮助我们自动完成使用网络浏览器时通常要做的最基本任务,如填写表格或截取特定页面的屏幕截图。

让我们通过 /r/learnprogramming Reddit 社区的截图来更好地了解它的功能。在项目文件夹中运行以下命令安装依赖项:

npm i puppeteer 

现在,创建一个新的 index.js 文件并键入或复制以下代码:

const puppeteer = require('puppeteer')

async function takeScreenshot() {
try {
const URL = 'https://www.old.reddit.com/r/learnprogramming/'
const browser = await puppeteer.launch()
const page = await browser.newPage()

await page.goto(URL)
await page.pdf({ path: 'page.pdf' })
await page.screenshot({ path: 'screenshot.png' })

await browser.close()
} catch (error) {
console.error(error)
}
}

takeScreenshot()

我们创建了takeScreenshot()异步函数。

如您所见,pdf()screenshot()方法可以帮助我们创建一个新的 PDF 文件和一张包含网页可视化组件的图片。

要运行它,请在新的终端窗口中运行node index.js。你会在项目文件夹中看到两个新文件,分别名为page.pdfscreenshot.png

很多自动化专家、数据科学家、质量保证工程师和软件开发人员都在使用Selenium。只需安装它并编写不到 10 行代码,我们就能感受到网络搜索的强大功能。

就像 Nightmare 一样,Selenium 通过完成页面打开、按钮点击或填写表格等操作来创建更逼真的 HTTP 请求。

我们可以在新的终端窗口中运行以下命令来安装 Selenium:

npm i selenium-webdriver

现在,让我们用谷歌搜索来试试。首先,创建一个新的 index.js 文件,然后键入或复制以下代码:

const {Builder, By, Key, until} = require('selenium-webdriver');

(async function example() {
let driver = await new Builder().forBrowser('firefox').build();
try {
await driver.get('http://www.google.com/');
await driver.findElement(By.name('q'));
await driver.sendKeys(web scraping, Key.RETURN);
await driver.wait(until.titleIs('web scraping - Google Search'), 1000);
} finally {
await driver.quit();
}
})();

更多信息请查看 Selenium文档

结论

网络搜刮是从网页中提取信息的一种非常强大的技术。对于上面介绍的任何一种使用情况,网络搜索都可以节省大量的金钱和时间。如果脚本编程得当,计算机可以提取和排列比人类多得多的信息。这就是为什么正确的库非常重要。

在进行网络搜索时会遇到困难。问题不可避免,但通常可以解决。归根结底,这与你的经验有关。如果你更喜欢使用 Selenium 而不是 Nightmare,那就继续吧。没有完美的库,我们知道这一点。我们只是希望能让您的决策过程不再那么复杂。

您可以阅读以下文章,了解更多有关网络刮擦的信息:

新闻和更新

订阅我们的时事通讯,了解最新的网络搜索指南和新闻。

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

相关文章

缩图
指南如何抓取亚马逊产品数据:最佳实践与工具综合指南

通过我们的深入指南,探索刮擦亚马逊产品数据的复杂性。从最佳实践和亚马逊 Scraper API 等工具到法律注意事项,了解如何应对挑战、绕过验证码并高效提取有价值的见解。

Suciu Dan
作者头像
Suciu Dan
15 分钟阅读
缩图
指南了解如何使用最好的 Selenium 浏览器绕过 Cloudflare 检测

了解在使用 Selenium 进行网络刮擦时,绕过 Cloudflare 检测系统的最佳浏览器是什么。

米赫内亚-奥克塔维安-马诺拉什
作者头像
米赫内亚-奥克塔维安-马诺拉什
9 分钟阅读
缩图
指南使用代理和 Axios Node.js 解除对网站的封锁并保护您的身份信息

了解如何使用代理与 Axios 和 Node.js 进行高效的网络抓取。包括使用 WebScrapingAPI 的技巧、代码示例和好处。

Suciu Dan
作者头像
Suciu Dan
7 分钟阅读