node爬虫(二)

1.如何安装

要通过js写爬虫,需要用到三个模块,request、cheerio和fs,其中fs内置了,只需要安装前两个即可,安装命令:

npm install request cheerio

2.获取网页内容

request会向回调函数传递三个参数,分别是error(错误信息),response(响应信息),htmlbody(网页内容):

var request =require('request');
var cheerio=require('cheerio');
var  fs=require('fs')

var moviesList=[];  //保存所有电影的数据
request.get('https://movie.douban.com/top250',(err,response,htmlbody)=>{
    //如果没有错误并且响应的状态为200 ,则连接成功
    if(!err&&response.statusCode==200){
      var $=cheerio.load(htmlbody);  //所有网页内容
      var movieiv=$('.item'); //拿到了对应标签的数组数据

      //通过循环获取详细的电影信息
      for(var i=0;i<movieiv.length;i++){
        var movieInfo=Takemovie(movieiv[i]);
        console.log('正在爬取《'+movieInfo.name+'》')
        //将电影放入数组中
        moviesList.push(movieInfo)
      }
    }else {
      console.log('出错了')
    }
  })

3.抓取电影信息

通过创建一个类来包含我们想要的属性,在每次调用Takemovie函数提取信息时都会初始化这个类,然后赋值给相应的属性;
之后放入moviesList数组里;


//定义一个movie 类
var Movie=function() {
  this.id=0;
  this.name='';  //电影名
  this.ename=''; //英文名
  this.role=''; // 专辑
  this.user=''; // 演员
  this.score=0; //评分
  this.psrc='';
  this.dis='';  //描述
}

var Takemovie=function (div) {
  var $=cheerio.load(div)
  //初始化类
  var m=new Movie();
  m.id=$('.pic').find('em').text(); //获取id
  m.name=$('.info .hd').find('span').eq(0).text(); //电影名
  m.ename=$('.info .hd').find('span').eq(1).text(); //英文名
  m.role=$('.info .hd .other').text(); //专辑
  m.user=$('.info .bd p').text(); //演员
  m.score=$('.info .bd .star .rating_num').text(); //评分
  m.psrc=$('.pic a img').attr('src'); //
  m.dis=$('.info .bd .quote .inq').text(); //影评

  return m
}

4.抓取所有电影

现在要爬取所有的top250信息,总共有10张网页,每张包含25部电影信息,创建一个函数来生成每张网页的网址,然后通过request进行爬取:


//爬取所有网页
var getAllMovies= function () {
  var len=['https://movie.douban.com/top250'];
  var olen='https://movie.douban.com/top250?start=';
  var allList=25;
  for(var i=0;i<10;i++){
    len.push(olen+allList)
    allList+=25;
  }
  return len;
}



var main=function () {
  var url=getAllMovies();  //链接地址数组

  for(var i=0;i<url.length;i++){
    requestMovies(url[i])
  }

}

main(); //启动
5.所有代码
var request =require('request');
var cheerio=require('cheerio');
var  fs=require('fs')

var moviesList=[];  //保存所有电影的数据
var requestMovies= function (url) {
  request.get(url,(err,response,htmlbody)=>{
    //如果没有错误并且响应的状态为200 ,则连接成功

    if(!err&&response.statusCode==200){

      var $=cheerio.load(htmlbody);  //所有网页内容
      var movieiv=$('.item'); //拿到了对应标签的数组数据

      //通过循环获取详细的电影信息
      for(var i=0;i<movieiv.length;i++){
        var movieInfo=Takemovie(movieiv[i]);
        console.log('正在爬取《'+movieInfo.name+'》')
        //将电影放入数组中
        moviesList.push(movieInfo)
      }

    //  爬取完毕
      if(moviesList.length==250){
        console.log('爬取完毕')
        // console.log(moviesList);

        fs.writeFile('./data.json',JSON.stringify(moviesList),(err)=>{
          if(err){
            console.log('文件写入失败')
          }else{
            console.log('文件写入成功')
          }
        })
      }

    }else {
      console.log('出错了')
    }
  })
}

//定义一个movie 类
var Movie=function() {
  this.id=0;
  this.name='';  //电影名
  this.ename=''; //英文名
  this.role=''; // 专辑
  this.user=''; // 演员
  this.score=0; //评分
  this.psrc='';
  this.dis='';  //描述
}

var Takemovie=function (div) {
  var $=cheerio.load(div)
  //初始化类
  var m=new Movie();
  m.id=$('.pic').find('em').text(); //获取id
  m.name=$('.info .hd').find('span').eq(0).text(); //电影名
  m.ename=$('.info .hd').find('span').eq(1).text(); //英文名
  m.role=$('.info .hd .other').text(); //专辑
  m.user=$('.info .bd p').text(); //演员
  m.score=$('.info .bd .star .rating_num').text(); //评分
  m.psrc=$('.pic a img').attr('src'); //
  m.dis=$('.info .bd .quote .inq').text(); //影评

  return m
}


//爬取所有网页
var getAllMovies= function () {
  var len=['https://movie.douban.com/top250'];
  var olen='https://movie.douban.com/top250?start=';
  var allList=25;
  for(var i=0;i<10;i++){
    len.push(olen+allList)
    allList+=25;
  }
  return len;
}



var main=function () {
  var url=getAllMovies();  //链接地址数组

  for(var i=0;i<url.length;i++){
    requestMovies(url[i])
  }

}

main(); //启动

最终结果:

爬取数据
文件目录结构

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值