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. IE浏览器提示对象不支持“append”属性或方法

    如下代码在IE浏览器中无法执行,提示对象不支持“append”属性或方法 var tImg = document.createElement("img"); tImg.setAtt ...

  2. Newtonsoft.Json 自定义序列化格式转化器

    public static class JsonHelper { static JsonHelper() { Newtonsoft.Json.JsonSerializerSettings settin ...

  3. echarts和highcharts

    highcharts是基于svg技术的 echarts基于canvas 后者可以在浏览器中实现3D图形  链接  ,这种效果highcharts是完全不可能做得到的.

  4. shell read line

    cat >b <<EOF line1 line2 line3 EOF # 方法1 while read line do echo ${line} done < <(cat ...

  5. 技巧:开启ubuntu系统的ssh服务

    执行下述命令,安装 openssh 服务器. $ sudo apt-get install openssh-server 执行下面命令,启动 openssh $ sudo service ssh st ...

  6. thinkPHP5.0验证码不显示

    1.使用composer安装时,验证码无法正常显示 主要是因为验证码扩展库的版本安装不正常,官方的5.0版本的扩展库版本号都是1.*,默认安装的是2.0版本,2.0版本均为ThinkPHP5.1版本专 ...

  7. 关于int类型表示的最大位数

    Integer 整型是有个范围的,而这个范围是跟平台版本有关的32位(最大值为:2^31 - 1)与64位(最大值为:2^63 - 1)的范围不一致.这时候超出范围的数字会被解释为float类型,所以 ...

  8. SQL SERVER linked server Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

    昨天创建了一个View, 这个view是一系列的表达式(CTE)组成,封装了好多的业务逻辑,简化下语句如下 ;with CTE AS( ...) SELECT a.company_id ,b.comp ...

  9. http 协议的简单学习 虽然有点老但是 还不错

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  10. stringstream的使用

    stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream.fstream有类似的操作方式.要使用stringstream, 必须先加入这一行: # ...