原本是打算要抓取豆瓣的电影排行榜的,在测试过程中,由于没有设置访问时间间隔,造成了短时间大量访问豆瓣,被暂时ip限制了,只能去抓取猫眼电影的排行榜了。
话不多说,直接上:
作为前端的小伙伴,大家在写东西的时候,经常需要用到数据,这时候直接从各大网站抓取我们需要的数据,用起来就比较方便了。
基本思路:
在node.js使用request获取页面内容。
通过cheerio中间件,就可以在node.js中,像jQuery一样去获取节点了。
把遍历好的数据返回json以供前台ajax获取使用,或者使用fs存入json文件。
下面直接上代码:
var express =require('express');
var router = express.Router();
var request =require("request");
var cheerio =require("cheerio");
var fs =require("fs");
var bugUrl ='http://maoyan.com/board/4?offset=';
router.get('/',async function (req, res, next) {
var data = [];
var count =0;
var result = [];
var url ='';
function requestUrl(count){
url = bugUrl + count;
request(url, function (error, response, body) {
if (!error && response.statusCode ==200) {
var $ = cheerio.load(body);
var navText = $('.board-wrapper dd');
if (navText.length >0&&count<100) {
Array.from(navText).forEach(function (value) {
var img =$(value).find(".image-link img.board-img").attr("data-src")
var title = $(value).find(".image-link img.board-img").attr("alt");
var url ="http://maoyan.com"+$(value).find(".board-item-main .name a").attr("href");
var rank = $(value).find(".board-index").text();
data.push({rank,title,img, url});
});
setTimeout(function () {
requestUrl(count +10);
console.log(count/10+"页")
},500)
}else {
writeJson(data);
res.json(data)
}
}else {
res.json(error);
}
});
}
function writeJson(params){
//现将json文件读出来
fs.readFile('./data/data.json',function(err,data){
if(err){
return console.error(err);
}
var str = JSON.stringify(Object.assign(params,JSON.parse(data.toString()))).toString();
fs.writeFile('./data/data.json',str,function(err){
if(err){
console.error(err);
}
console.log('----------新增成功-------------');
})
})
}
requestUrl(0)
});
module.exports = router;