本文预计阅读4分钟。
今天刷贴吧的时候突发奇想,爬一波贴吧的帖子,说爬就爬。贴吧选择了比较有趣的「扒皮吧」。目标爬取贴吧首页标题及链接地址并保存到本地文件。
接下来就是代码实施,用 Node.JS 来爬取。
首先第一步,引包。
// 选用方便的 request 包来发送访问请求。
constrequest =require('request');
// 用 cheerio 来解析爬到的页面
constcheerio =require('cheerio');
// fs 读写文件
constfs =require('fs');
然后就要开始发送请求了
// 地址去贴吧直接复制粘贴,使用 get 方式请求
request.get('https://tieba.baidu.com/f?ie=utf-8&kw=%E6%89%92%E7%9A%AE&fr=search',function(err,res,body){
// 错误处理
if(err){
console.log(err);
}
// 使用 cheerio 对爬到的页面进行处理
var$ = cheerio.load(body);
// 声明一个 数组储存话题信息
vartopic = [];
// 通过 Chrome 浏览器F12检查,找到标题信息存放的标签
// 类名为 j_th_tit 通过 each 方法遍历
$(".j_th_tit ").each(function(index, el){
var$el = $(el);
// 获取标题和链接
vartitle = $el.attr('title');
varhref = $el.attr('href');
// 以对象方式存入 topic 数组
topic.push({
title: title,
href: href,
})
})
这个时候如果直接输出 topic 的话就会发现这种情况:
这个时候就需要将 topic 转成 JSON 数据:
topic= JSON.stringify(topic);
调用 fs 模块将数据写入 topic.json 文件:
fs.writeFile('topic.json', topic);
这个时候会有一条提示信息,意思是 fs.writeFile() 是异步方法但没有写回调函数,这里输出文件后没有再执行的代码,可以不用理会。
查看 JSON 文件:
发现每隔一个有一个空集合,然后遍历 topic 数组去掉空集合:
// 声明一个临时变量 temp 储存数据
vartemp = [];
for(leti =1; i
temp.push(topic[i]);
};
最终的代码:
constrequest =require('request');
constcheerio =require('cheerio');
constfs =require('fs');
request.get('https://tieba.baidu.com/f?ie=utf-8&kw=%E6%89%92%E7%9A%AE&fr=search',function(err,res,body){
if(err){
console.log(err);
}
var$ = cheerio.load(body);
vartopic = [];
$(".j_th_tit ").each(function(index, el){
var$el = $(el);
vartitle = $el.attr('title');
varhref = $el.attr('href');
topic.push({
title: title,
href: href,
})
})
vartemp = [];
for(leti =1; i
temp.push(topic[i]);
};
temp =JSON.stringify(temp);
fs.writeFile('topic.json', temp);
});
文件内容
PS:最新干货分享请回复学习资源领取!
最后不要忘记转发和点赞哦~
领取专属 10元无门槛券
私享最新 技术干货