下面我来为你详细讲解如何使用Node.js实现网页爬虫功能。
- 准备工作
在开始编写代码之前,我们需要先安装Node.js和一些相关的模块。具体步骤如下:
1.1 安装Node.js
请先在官网https://nodejs.org/zh-cn/下载Node.js的安装包,然后按照提示安装即可。
1.2 安装Request模块
我们使用Request模块来发起http请求获取页面内容。在CMD中执行以下命令即可:
npm install request
1.3 安装Cheerio模块
我们使用Cheerio模块来解析页面节点。在CMD中执行以下命令即可:
npm install cheerio
- 使用Request模块发起http请求获取页面内容
我们先来看一个简单的例子。下面的代码可以获取百度首页的html内容。
const request = require('request');
request('https://www.baidu.com', function (error, response, body) {
if (!error && response.statusCode === 200) {
console.log(body);
}
});
其中,request函数用于发起http请求。第一个参数为请求的url;第二个参数为请求回调函数,它接收三个参数:error、response、body。其中,error表示请求过程中产生的错误;response包含了服务器返回的信息,比如状态码、头信息等;body表示服务器返回的html内容。
- 使用Cheerio模块解析页面节点
获取到页面的html内容之后,我们需要对其进行解析,这时候Cheerio模块就派上用场了。下面的代码可以获取百度首页的标题。
const request = require('request');
const cheerio = require('cheerio');
request('https://www.baidu.com', function (error, response, body) {
if (!error && response.statusCode === 200) {
const $ = cheerio.load(body);
const title = $('title').text();
console.log(title);
}
});
其中,cheerio.load函数用于将页面内容转换成可操作的节点对象。接着,我们使用$('title')来获取页面标题节点,再使用text()方法获取其文本内容。
- 示例1:爬取Node.js中文网站的文章列表
下面,我们将这两个模块结合起来,实现一个简单的爬虫。我们的目标是爬取Node.js中文网站的文章列表。
文章列表的url为:https://www.nodejs.cn/learn。我们可以使用Request模块获取它的html内容,然后使用Cheerio模块解析出文章标题和链接。
const request = require('request');
const cheerio = require('cheerio');
request('https://www.nodejs.cn/learn', function (error, response, body) {
if (!error && response.statusCode === 200) {
const $ = cheerio.load(body);
const articleList = [];
$('.learn-content-item').each(function(i, e) {
const title = $(e).find('.learn-content-title').text().trim();
const url = $(e).find('.learn-content-item-cta>a').attr('href');
articleList.push({
title,
url
});
});
console.log(articleList);
}
});
在上面的代码中,我们首先使用$('.learn-content-item')获取到所有文章节点,再对每个节点进行遍历,解析出标题和链接并加入到列表中。最终的输出结果如下:
[
{
"title": "Node.js 命令行接口开发工具包",
"url": "/docs/command-line-api/"
},
{
"title": "Node.js 输入输出",
"url": "/docs/guides/blocking-vs-non-blocking/"
},
{
"title": "Node.js 文件系统",
"url": "/docs/guides/file-system/"
},
// more articles...
]
- 示例2:爬取掘金网站的文章列表
接下来,我们再来看一个稍微复杂一些的例子。我们的目标是爬取掘金网站(https://juejin.cn/)的文章列表。注意,由于掘金网站使用了反爬虫机制,所以我们需要使用请求头模拟真实浏览器发起请求。
const request = require('request');
const cheerio = require('cheerio');
const options = {
url: 'https://api.juejin.cn/recommend_api/v1/article/recommend_all_feed',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Agent': 'Juejin/Web',
'X-Legacy-Device-Id': '1624588307264',
'X-Legacy-Token': ''
},
json: true,
body: {
id_type: 2,
client_type: 2608,
cursor: '0',
limit: 20
}
};
request(options, function (error, response, body) {
if (!error && response.statusCode === 200) {
const articleList = [];
body.data.forEach((d) => {
articleList.push({
title: d.article_title,
url: `https://juejin.cn/post/${d.article_id}`
});
});
console.log(articleList);
}
});
在上面的代码中,我们使用POST请求访问https://api.juejin.cn/recommend_api/v1/article/recommend_all_feed接口,获取到JSON格式的文章列表。其中,请求头中的X-Legacy-Token字段需要被替换为真实的token。
最终,我们使用forEach方法对每个文章节点解析出标题和链接,并将它们加入到articleList列表中。输出结果如下:
[
{
"title": "JavaScript操作剪贴板那些事",
"url": "https://juejin.cn/post/6969704246673395759"
},
{
"title": "浅拷贝、深拷贝及其实现",
"url": "https://juejin.cn/post/6969542464278981640"
},
{
"title": "写了一个 POC 实现窃取微信账号登录态的黑产服务",
"url": "https://juejin.cn/post/6969401789501857822"
},
// more articles...
]
以上就是使用Node.js实现网页爬虫功能的完整攻略。就像其他编程技能一样,爬虫也需要遵守相关法律法规,不能用于非法用途。同时,也需要考虑到被爬取网站的反爬虫机制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node实现的爬虫功能示例 - Python技术站