关注“重度前端”
助力前端深度学习
━━━━━
前言
咱们继续上一篇继续将这个小爬虫的功能再完善一下。
获取电影下载连接
如果是人工操作,我们需要一次操作,通过点击进入电影详情页才能找到下载地址
常规先来分析页面布局
我们如果想要准确定位到下载链接,需要先找到id
为Zoom
的div,下载链接就在这个div
下的tr
下的a
标签内。
那我们就再定义一个函数,用于获取下载链接
getBtLink()
function getBtLink(urls, n) { //urls里面包含着所有详情页的地址
console.log("正在获取第" + n + "个url的内容");
http.get('http://www.ygdy8.net' + urls[n].title, function(sres) {
var chunks = [];
sres.on('data', function(chunk) {
chunks.push(chunk);
});
sres.on('end', function() {
var html = iconv.decode(Buffer.concat(chunks), 'gb2312'); //进行转码
var $ = cheerio.load(html, {decodeEntities: false});
$('#Zoom td').children('a').each(function (idx, element) {
var $element = $(element);
btLink.push({
bt: $element.attr('href')
})
})
if(n < urls.length - 1) {
getBtLink(urls, ++count); //递归
} else {
console.log("btlink获取完毕!");
console.log(btLink);
}
});
});
}
再次运行 node index
就这样我们将3个页面内所有电影的下载链接获取完毕,是不是很简单?
保存数据
我们讲这些数据爬取出来当然是要进行保存的啊,在这里我选用了MongoDB来对其进行保存处理
数据保存函数 save()
function save() {
var MongoClient = require('mongodb').MongoClient; //导入依赖
MongoClient.connect(mongo_url, function (err, db) {
if (err) {
console.error(err);
return;
} else {
console.log("成功连接数据库");
var collection = db.collection('node-reptitle');
collection.insertMany(btLink, function (err,result) { //插入数据
if (err) {
console.error(err);
} else {
console.log("保存数据成功");
}
})
db.close();
}
});
}
这里的操作很简单,就没必要上mongoose啦再次运行 node index
这个Node.js实现的爬虫就是这样了,祝大家能爬到自己想要的数据;)
源码地址:https://github.com/HuangXiZhou/node-reptitle
总结:
本文这个小爬虫用了两篇文章咱们讲完了,从技术上来说还是比较基础的,不过技术这东西都是举一反三的。我们可以思考下爬虫的原理是什么?我能想到的是通过http请求把网页的数据拿到,然后对文档内容进行解析,用了jq的操作习惯。当然如果我们自己写也是可以写的,只是开发体验没这么高级,当然我们也可以实现他的操作方式,只是这个库帮我们处理完了。
关于本文
原文地址:
https://segmentfault.com/a/1190000008745531
都说前端fe不是帅哥就是美女,我说对了【点个赞吧-右下角】
重度前端--助力深度学习
为web前端同行提供有价值、有深度的技术文章
官网:http://bigerfe.com【建设中】
长按二维码关注我