网络爬虫入门(附Node.js示例)
说到网页抓取,Python无疑是王者。像Scrapy和Beautiful 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。
- 创建一个名为你选择名称的新目录,然后运行:
npm init
- 安装依赖项。我们将使用axios发送 HTTP 请求,并使用 cheerio来帮助我们解析返回的 HTML。
npm install --save cheerio axios
- 为我们的爬虫代码创建一个文件:
touch index.js
- 由于我们的爬虫会发出 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!'))
- 我们需要的 HTML 字符串将存储在axios
data响应的属性中。现在,我们需要将此 HTML 加载到之前下载的cheerio包中。请将以下代码添加到我们的代码块中:.then()
const $ = cheerio.load(response.data);
- 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
- 让我们看看代码的实际运行效果!在终端中运行:
- 运行 `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!'))