发布于 2026-01-05 4 阅读
0

网络爬虫入门(附Node.js示例)

网络爬虫入门(附Node.js示例)

说到网页抓取,Python无疑是王者。像ScrapyBeautiful Soup这样的框架让解析原始 HTML 变得(相对)简单,几分钟就能搭建一个基本的网页抓取工具。幸运的是,对于 JavaScript 开发者来说,也有一些非常棒的工具可以实现类似的网页抓取功能。本文将简要介绍如何使用 Node.js 和Cheerio进行网页抓取。我们还将构建自己的网页抓取器,从我们选择的网站提取图片 URL!

什么是网络爬虫?

根据实时互联网统计数据,如今互联网上存在超过17亿个网站。据估计,谷歌掌握的网页数量超过130万亿(2016年的估计数据,这是我能找到的最新数据……)。简而言之,互联网上存在着海量数据。网络爬虫是一种帮助我们从海量数据中筛选信息的工具。最简单的网络爬虫会请求网页的HTML代码,并快速筛选出程序员指定的目标内容。这些目标内容包括联系信息、电话号码、嵌入式链接——实际上,任何你能想到的存在于原始HTML请求中的信息,它们都会被抓取。你可能会想,API不是用来共享数据的吗?没错,但很多网站没有API,即使有API的网站,也可能不希望你轻易访问其网页中包含的整理好的信息。这时,网络爬虫就成了我们完成这些繁琐工作的工具。

网络爬虫合法吗?

在正式开始构建网络爬虫之前,务必注意,有些网站不允许用户抓取其内容。例如,Craigslist 就曾因其他公司抓取其网站内容而提起诉讼,并最终获得数百万美元的赔偿。因此,在尝试抓取任何网站之前,最好先查看robots.txt其配置文件。通常,可以在大多数网站的域名末尾添加 `/etc/website.txt` 来找到配置文件robots.txt。以下是 Craigslist 的配置文件示例: 需要注意的是,编写程序(机器人)向这些端点发送请求是不允许的。您还应该查看网站的使用条款,通常可以在页脚或“关于我们”页面找到。所以,在开始之前,请务必做好功课。在下面的示例中,我们将向http://books.toscrape.com/发送请求,这是一个专门用于练习网络爬虫的网站。
替代文字

构建一个简单的网络爬虫

前提条件:必须已安装Node.js。

  1. 创建一个名为你选择名称的新目录,然后运行:
    • npm init
  2. 安装依赖项。我们将使用axios发送 HTTP 请求,并使用 cheerio来帮助我们解析返回的 HTML。
    • npm install --save cheerio axios
  3. 为我们的爬虫代码创建一个文件:
    • touch index.js
  4. 由于我们的爬虫会发出 HTTP 请求,我们需要能够等待响应。Axios 默认返回一个 Promise,因此我们可以使用 Promise 来.then()访问我们想要设置的 HTML 内容。以下是 Axios 请求的基本设置。
const axios = require('axios');
const cheerio = require('cheerio');

axios('http://books.toscrape.com/')
  .then((response) => {
    // our scraping code will go here!
  })
  .catch(() => console.log('something went wrong!'))
  1. 我们需要的 HTML 字符串将存储在axiosdata响应的属性中。现在,我们需要将此 HTML 加载到之前下载的cheerio包中。请将以下代码添加到我们的代码块中:.then()
const $ = cheerio.load(response.data);
  1. Cheerio可以处理 HTML 字符串,并允许我们选择 HTML 标签、类、ID、属性和标签内容,其功能几乎与 jQuery 完全相同。让我们记录books.toscrape 页面 HTML 中第一个img标签的 URI。添加以下代码:src
const firstUrl = $('body').find('img').attr('src')
console.log(firstUri)

请注意,我们首先选择的是body标签。该方法会选择标签内的.find()第一个子标签。最后,它允许我们选择第一个子标签内属性的内容。即使是像照片 URL 这样简单的内容,也确实需要一些探索,对吧?!imgbody.attr()srcimg

  1. 让我们看看代码的实际运行效果!在终端中运行:
  2. 运行 `node index.js` 后,你的代码可能需要一些时间才能运行。这是因为我们需要等待 axios 请求完成,而 cheerio 解析所有 HTML 也需要一些时间。如果你已连接到互联网,你应该会uri在控制台中看到一个图像输出。以下是我得到的结果:替代文字

虽然这个例子确实比较基础,但想象一下,如果能创建一个机器人,每天自动抓取动态网站上的所有图片URI,而你却无需做任何操作,那该有多方便!我们甚至可以让网页爬虫找到按钮next page,使其能够取网页,甚至还能跳转到新的网页!

理想情况下,每个网站都会创建一个美观且文档齐全的API,并向所有需要的人开放访问权限。但目前,网络爬虫也能满足需求。不妨亲自尝试一下,享受其中的乐趣!

以下是超基础图像URI抓取器的完整代码:

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

axios('http://books.toscrape.com/')
  .then((response) => {
    const $ = cheerio.load(response.data);
    const firstUrl = $('body').find('img').attr('src')
    console.log(firstUrl)

  })
  .catch(() => console.log('something went wrong!'))
文章来源:https://dev.to/aveb/intro-to-web-scraping-w-node-js-example-5a9p