下面我将为大家讲解“node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)”的完整攻略。
什么是node.js基于cheerio的爬虫工具?
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,可以在服务器端运行 JavaScript 代码。Cheerio 是 Node.js 中一个非常流行的小型解析 HTML 和 XML 文档的库。基于这两个工具,我们可以实现一个强大的爬虫工具,用于爬取需要登录权限的网站数据。
如何实现一个需要登录权限的爬虫工具?
下面是该爬虫工具的基本实现过程:
- 导入所需模块,包括
http
,https
,cheerio
,querystring
等模块。 - 构造 HTTP POST 请求,发送登录请求并保存cookies。
- 发送需要登录状态才能查看的请求,保存数据并解析。
- 将解析好的数据进行处理,可以输出到控制台,也可以保存到本地。
下面我们通过两个简单的示例来讲解如何实现爬虫工具。
示例1:爬取知乎自己的回答
1. 登录知乎并保存cookies
const https = require('https');
const cheerio = require('cheerio');
const querystring = require('querystring');
// 构造登录信息
const postData = querystring.stringify({
'username': 'your username',
'password': 'your password'
});
// 构造请求头
const headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData),
// 伪装成浏览器
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Referer': 'https://www.zhihu.com/'
};
// 构造登录请求
const loginOptions = {
hostname: 'www.zhihu.com',
port: 443,
path: '/signin',
method: 'POST',
headers: headers
};
// 发送登录请求
const req = https.request(loginOptions, (res) => {
console.log(`Status: ${res.statusCode}`);
console.log(`Headers: ${JSON.stringify(res.headers)}`);
// 保存cookies
const cookies = res.headers['set-cookie'];
const cookie = cookies.map(item => item.split(';')[0]).join('; ');
});
// 处理登录请求错误
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// 将登录信息写入请求体并发送
req.write(postData);
req.end();
在上面的代码中,我们首先构造了一个POST请求,发送用户名和密码。然后通过构造请求头信息,发送请求并保存cookies。这样我们就可以使用这个cookies来访问需要登录状态才能查看的页面了。
2. 爬取数据并解析
// 构造需要登录状态的请求
const displayOptions = {
hostname: 'www.zhihu.com',
port: 443,
path: '/api/v4/members/{your username}/answers?include=data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,is_labeled,label_info;data[*].mark_infos[*].url;data[*].author.follower_count,badge[*].topics',
method: 'GET',
headers: {
'Content-Type': 'application/json',
// 携带cookies信息
'Cookie': cookie,
// 伪装成浏览器
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Referer': 'https://www.zhihu.com/'
}
};
// 发送请求
const req1 = https.request(displayOptions, (res) => {
console.log(`Status: ${res.statusCode}`);
console.log(`Headers: ${JSON.stringify(res.headers)}`);
// 监听数据
res.on('data', (d) => {
// 解析数据
const $ = cheerio.load(d, {decodeEntities: false});
const data = JSON.parse($.html());
console.log(data);
});
});
// 处理错误
req1.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
req1.end();
在上面的代码中,我们构造了一个需要登录状态才能查看的请求,并在请求头中携带cookies信息。通过发送请求并解析数据,我们就可以得到自己在知乎上发表的所有回答信息,包括回答的问题、问题的链接、回答的时间等等。
示例2:爬取CSDN博客中的文章信息
1. 登录CSDN并保存cookies
const http = require('http');
const querystring = require('querystring');
const cheerio = require('cheerio');
// 构造登录信息
const postData = querystring.stringify({
'username': 'your username',
'password': 'your password'
});
// 构造请求头
const headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData),
// 伪装成浏览器
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
};
// 构造登录请求
const loginOptions = {
hostname: 'passport.csdn.net',
port: 80,
path: '/login',
method: 'POST',
headers: headers
};
// 发送登录请求
const req = http.request(loginOptions, (res) => {
console.log(`Status: ${res.statusCode}`);
console.log(`Headers: ${JSON.stringify(res.headers)}`);
// 保存cookies
const cookies = res.headers['set-cookie'];
const cookie = cookies.map(item => item.split(';')[0]).join('; ');
//构造请求头
const headers1 = {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData),
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Cookie': cookie
};
// 构造请求选项
const displayOptions = {
hostname: 'blog.csdn.net',
port: 80,
path: '/{your username}/article/list/1',
method: 'GET',
headers: headers1
};
// 发送请求获取所需数据
const req1 = http.request(displayOptions, (res) => {
console.log(`Status: ${res.statusCode}`);
console.log(`Headers: ${JSON.stringify(res.headers)}`);
// 监听数据
res.on('data', (d) => {
// 解析数据
const $ = cheerio.load(d, {decodeEntities: false});
$('a[href^="https://blog.csdn.net/{your username}/article/details"]').each(function(index, item) {
console.log(index + ': ' + $(this).text() + ': ' + $(this).attr('href'));
});
});
});
// 处理错误
req1.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
req1.end();
});
// 处理登录请求错误
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// 将登录信息写入请求体并发送
req.write(postData);
req.end();
在上面的代码中,我们使用http模块,构造登录信息发送请求,得到登录后的cookies信息。在获取到cookies后,我们重新构造请求头并发送获取数据的请求,解析数据并输出到控制台。
最后,这只是一个简单的示例,实际的项目中需要考虑到更多的异常情况处理,如请求超时、网络错误等等,相信大家可以根据自身需求进行改进。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具) - Python技术站