原本是打算要抓取豆瓣的電影排行榜的,在測(cè)試過程中,由于沒有設(shè)置訪問時(shí)間間隔,造成了短時(shí)間大量訪問豆瓣,被暫時(shí)ip限制了,只能去抓取貓眼電影的排行榜了。
話不多說,直接上:
作為前端的小伙伴,大家在寫東西的時(shí)候,經(jīng)常需要用到數(shù)據(jù),這時(shí)候直接從各大網(wǎng)站抓取我們需要的數(shù)據(jù),用起來就比較方便了。
基本思路:
在node.js使用request獲取頁面內(nèi)容。
通過cheerio中間件,就可以在node.js中,像jQuery一樣去獲取節(jié)點(diǎn)了。
把遍歷好的數(shù)據(jù)返回json以供前臺(tái)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){
//現(xiàn)將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;