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

node实现爬虫的更多相关文章

  1. 【原】小玩node+express爬虫-2

    上周写了一个node+experss的爬虫小入门.今天继续来学习一下,写一个爬虫2.0版本. 这次我们不再爬博客园了,咋玩点新的,爬爬电影天堂.因为每个周末都会在电影天堂下载一部电影来看看. talk ...

  2. Node.js爬虫-爬取慕课网课程信息

    第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...

  3. node.js爬虫

    这是一个简单的node.js爬虫项目,麻雀虽小五脏俱全. 本项目主要包含一下技术: 发送http抓取页面(http).分析页面(cheerio).中文乱码处理(bufferhelper).异步并发流程 ...

  4. <node.js爬虫>制作教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...

  5. node:爬虫爬取网页图片

    代码地址如下:http://www.demodashi.com/demo/13845.html 前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图片 ...

  6. Node.js aitaotu图片批量下载Node.js爬虫1.00版

    即使是https网页,解析的方式也不是一致的,需要多试试. 代码: //====================================================== // aitaot ...

  7. Node.js umei图片批量下载Node.js爬虫1.00

    这个爬虫在abaike爬虫的基础上改改图片路径和下一页路径就出来了,代码如下: //====================================================== // ...

  8. Node.js abaike图片批量下载Node.js爬虫1.01版

    //====================================================== // abaike图片批量下载Node.js爬虫1.01 // 1.01 修正了输出目 ...

  9. Node.js abaike图片批量下载Node.js爬虫1.00版

    这个与前作的差别在于地址的不规律性,需要找到下一页的地址再爬过去找. //====================================================== // abaik ...

  10. Node JS爬虫:爬取瀑布流网页高清图

    原文链接:Node JS爬虫:爬取瀑布流网页高清图 静态为主的网页往往用get方法就能获取页面所有内容.动态网页即异步请求数据的网页则需要用浏览器加载完成后再进行抓取.本文介绍了如何连续爬取瀑布流网页 ...

随机推荐

  1. hdu6299 Balanced Sequence 贪心

    题目传送门 题目大意:给出n个字符串,定义了平衡字符串,问这些字符串组合之后,最长的平衡字符子序列的长度. 思路: 首先肯定要把所有字符串先处理成全是不合法的,记录右括号的数量为a,左括号的数量为b, ...

  2. python3 发送邮件添加附件

    from email.header import Headerfrom email.mime.application import MIMEApplicationfrom email.mime.mul ...

  3. jdk的环境配置

    今天在网上找了关于jdk配置的教程,发现比较繁琐,因此更新下jdk的简单配置教程 注意:jdk的安装必须正确,绝对不允许将jdk和jdr安装在同一层目录!!(建议在java目录下新建jdk和jdr目录 ...

  4. 27-----BBS论坛

    BBS论坛(二十七) 27.首页帖子列表布局完成 (1)apps/models.py 把帖子跟用户关联起来 class PostModel(db.Model): __tablename__ = 'po ...

  5. Android NDK开发 Android Studio使用新的Gradle构建工具配置NDK环境(一)

    本文主要讲述了如何如何在Android Studio使用新的Gradle构建工具配置NDK环境,现在把相关的步骤整理出来分享给Android程序员兄弟们,希望给他们在配置NDK环境时带来帮助. 从An ...

  6. PlayMaker Play Sound 和 Audio Play

    这两个 Action 都可以播放声音 *Play Sound:只要把声音拖进去就可以: *Audio Play:要求游戏对象要有Audio Source组件.

  7. Django重新整理4---ModelForm-set(批量处理数据)

    1. #引用modelformset from django.forms.models import modelformset_factory #必须继承forms.ModelForm! class ...

  8. ApplicationContextAware的作用

    ApplicationContextAware其实我们看到---Aware就知道是干嘛用的了,就是属性注入的, 但是这个ApplicationContextAware的不同地方在于,实现了这个接口的b ...

  9. pat1089. Insert or Merge (25)

    1089. Insert or Merge (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Accor ...

  10. Android JNI和NDK的关系

    转自:http://blog.csdn.net/elfylin/article/details/6121466 1.什么JNI Java Native Interface(JNI)标准是java平台的 ...