Fork me on GitHub

node实现爬虫

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

 

 

 

posted @ 2017-07-24 15:32  zhang_yx  阅读(276)  评论(0编辑  收藏  举报