当前位置: 首页 > article >正文

nodejs 使用async进行BT吧最新电影数据爬取

在百度上面有许多关于使用nodejs进行网页数据爬取的例子,但是大多数都只是爬取的单页面数据。但是设想如果我们爬取到的是一个页面的url,然后我们要再次访问url进行下一个页面的爬取。这样有许多人就可能会想到执行两次,但是事实上我们只需要一次请求就可以完成。但是因为nodejs的异步机制,这就让我们必须要使用到async的walterfall和whilst,下面就以抓取BT吧最新电影数据为例:

var express = require("express");
//网络请求模块
var request = require("request");
//将html代码转为jquery可以解析的模块
var cheerio = require("cheerio");
//转换编码模块
var iconv = require("iconv-lite");
//异步模块---walterfall和whilst
var async = require("async");
var app = express();//设置跨域访问
app.all('*', function(req, res, next) {res.header("Access-Control-Allow-Origin", "*");res.header("Access-Control-Allow-Headers", "X-Requested-With");res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");res.header("Content-Type", "application/json;charset=utf-8");next();
});
//BT吧最新电影
app.get('/BTMovies/newMovies',function(req,res){
/*
进行地址和详细信息的抓取,因为nodejs异步的原因会导致在还没有抓取到地址的时候就进行了详细信息的获取,所以这种方式不采用
*/
//  request('http://www.btba.com.cn/',function(error,response,body){
//      if(!error && response.statusCode == 200){
//          $ = cheerio.load(body);
//          var array = [];
//          $('.year li a').each(function(i,item){
//              var object = {
//                  title:'',
//                  url :'',
//                  img :''
//              }
//              object.title = $(this).attr('title');
//              object.url = $(this).attr('href');
//              request(object.url,function(error,response,body){
//                  if(!error && response.statusCode == 200){
//                      $ = cheerio.load(body);
//                      object.img = $('.l img').attr('src');
//                  }
//              })
//              array.push(object);
//          })
//          res.json({
//              newMovies:array
//          })
//      }
//  })
/*先采用walterfall进行最新电影的详细地址获取然后再根据获取到的地址采用whilst进行循环抓取详细信息*/async.waterfall([function(callback){request('http://www.btba.com.cn/',function(error,response,body){if(!error && response.statusCode == 200){$ = cheerio.load(body,{decodeEntities: false});var array = [];$('.year li a').each(function(i,item){var object = {title:'',url :'',img :'',download:[],}object.title = $(this).attr('title');object.url = $(this).attr('href');array.push(object);})callback(null, array);}})}], function (err, result) {var length = result.length;var i = 0;async.whilst(function() { return i < length; },function(callback) {i++;request(result[i-1].url,function(error,response,body){if(!error && response.statusCode == 200){$ = cheerio.load(body,{decodeEntities: false});var img = $('.l img').attr('src');var download_array = [];$('.btinfo h3').each(function(i,item){var download_info = {url:'',size:'',info:''};download_info.url = $(this).find('a').attr('href');download_info.size = $(this).find('b').html();download_info.info = $(this).find('i').html();download_array.push(download_info);})result[i-1].img = img;result[i-1].download = download_array.slice();callback(null, result);}})                              },function (err, content) {res.json({data:content})});});
})var server = app.listen(4444, function() {console.log('监听端口 4444');
});
http://www.lryc.cn/news/2413825.html

相关文章:

  • FLASH常见问题
  • C/C++《计算思维综合实践I》参考选题(84题)[2024-05-22]
  • 个人面试总结暨2020年终总结
  • 聊一聊go的单元测试(goconvey、gomonkey、gomock、ginkgo)
  • 乐Pad A1拆机全程
  • 小周恋爱日记网站
  • 恐龙机器人钢索恐龙形态_机器恐龙铁渣2.0:P1S的钢索终于有伴了
  • 如何查找和注册已备案过期域名
  • 【纯转】Div+CSS经典速成教程。
  • 一文实现nnUNet v2 分割肾脏肿瘤数据集KiTS19
  • win篇--winserver2008R2系统自动更新报错:代码:80092004
  • 火狐与IE兼容性总结(待整理,代码有点乱)
  • MDK常用快捷键和操作
  • 企业竞争竞争情报系统的流程整合
  • 天天酷跑刷钻石辅助下载 最新无异常攻略
  • vs2005 创建动态库及其调用方法
  • CDLINUX U盘安装教程
  • 图像处理入门教程
  • 我的百度blog
  • ctfshow web176-? 的waf(方便对题目差异)
  • 获取屏幕宽度_手机屏幕的那些门道,一文看懂!
  • 未来三年的移动互联网创业----创新工场创始合伙人汪华 在移动开发者大会上的演讲
  • 网页三剑客的一些序列号
  • vue下实现类似android或者ios通讯录(银行选择)-网页版
  • 解决横竖屏样式错乱问题
  • 我们注意到您的计算机目前处于离线状态_如何将您的计算机添加到Pekka网络
  • jsDoc+docdash生成说明文档
  • 雷军早期计算机论文曝光!引来华为高管点赞!
  • 如何发送一个指令给另外一个进程[进程通信2]
  • DSPTMS320F28335入门