node实现获取到豆瓣电影排行榜页面。
准备工作:
1.新建一个文件夹node 在当前文件夹中打开cmd
下载 npm install
初始化 npm init(注意一下:如果你的npm init没有作用可以使用npm init -y)
2.下载模块
- superagent可以发起http请求
- cheerio解析http返回的html内容,可以理解为一个Node.js版的 jquery,使用方式跟jquery相同
- fs设置文件,在获取到图片的路径之后,可以实现将图片保存在本地
- request采用这个模块,向服务器发起请求,获取图片资源
- eventproxy:利用事件机制解决回调函数深度嵌套的问题
- async:多线程并发控制
3.在node中新建两个文件夹
data放置得到的数据的内容 image获取得到的图片
开始编写代码。
var superagent=require('superagent');
var cheerio=require('cheerio');
var url=require('url');
var fs=require("fs");
var request=require('request');
var targeturl='https://movie.douban.com/chart';
var eventproxy=require('eventproxy');
var ep=new eventproxy()
var async=require('async')
superagent.get(targeturl).end(function(err,res){
if(err){
return console.error(err)
}
console.log('爬虫开始')
var $=cheerio.load(res.text);//利用cheerio开始解析页面
var repoUrls=[];//保存url
var titleArray=[];
console.log($('.item .pl2').length)
$(".item .pl2").each(function(index,element){
var $element=$(element);
var href=url.resolve('https://movie.douban.com',$element.find("a").attr('href'))
repoUrls.push(href)
//获取每个仓库名字
var $title=$element.find("a").contents()
$title=$title[0].data.substr(0,$title.length-1)
titleArray.push($title)
var news={
//名字
title:$title,
//路径
url:href
}
console.log($)
saveImage($,news)
})
repoUrls=repoUrls.slice(0,2)
concurrencyCount=0;//当前并发记录
var fetchUrl=function(repoUrl,callback){
concurrencyCount++
console.log('现在的并发数是',concurrencyCount,',正在抓取的是',repoUrl)
superagent.get(repoUrl).end(function(err,res){
var $=cheerio.load(res.text);
//对也面内容进行解析
var httpGitUrl=$('.item').attr('value')
return ({
url:repoUrl,
httpGitUrl:httpGitUrl
})
concurrencyCount--;
callback(null,repoUrl)
});
}
async.mapLimit(repoUrls,5,function(repoUrl,callback){
//对每个url进行相关处理
fetchUrl(repoUrl,callback)
},function(err,result){
console.log('final');
}
)
})
//保留图片资源
function saveImage($,news){
$(".item .nbg img").each(function(index,item){
var img_title=$(this).attr("alt");//获取图片名字
console.log(img_title)
var img_filename=img_title+'.jpg';
var img_src=$(this).attr("src");//获取图片的路径
//采用request模块,向服务器发起一次请求,获取图片资源
request.head(img_src,function(err,res,body){
if(err){
console.log(err)
}
});
request(img_src).pipe(fs.createWriteStream('./image/'+news+'---'+img_filename))
})
}
这样代码就完成了
开始执行代码:
然后再cmd中node index.js就可以了
git地址:https://github.com/GainLoss/MyNode/tree/master/Node%20crawler
参考:
https://byronlun.github.io/posts/2017-01-20-NodeJS爬虫摸索教程.html
http://blog.csdn.net/yezhenxu1992/article/details/50820629