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. spoj COT - Count on a tree(主席树 +lca,树上第K大)

    您将获得一个包含N个节点的树.树节点的编号从1到Ñ.每个节点都有一个整数权重. 我们会要求您执行以下操作: uvk:询问从节点u到节点v的路径上的第k个最小权重 输入 在第一行中有两个整数Ñ和中号.( ...

  2. hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. B. Sereja and Suffixes

    B. Sereja and Suffixes time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. 1.Hibernate框架

    1.分层体系结构与持久化 三层体系结构: 分层体系结构: 指的是将系统的组件分隔到不同的层中,每一层中的组件应保持内聚性,并且应大致在同一抽象级           别: 每一层都应与它下面的各层保持 ...

  5. IKVM:java代码c#调用

    在工作中遇到对接java接口,涉及到java加密或签名问题,.net无法实.就将java代码编辑为dll给.net调用 注:这里只做简单java代码处理,不涉及到复杂的java包 java文件处理: ...

  6. hbase数据库操作

    .实验内容与完成情况:(实验具体步骤和实验截图说明) (一)编程实现以下指定功能,并用 Hadoop 提供的 HBase Shell 命令完成相同任务: () 列出 HBase 所有的表的相关信息,例 ...

  7. java——红黑树 RBTree

    对于完全随机的数据,普通的二分搜索树就很好用,只是在极端情况下会退化成链表. 对于查询较多的情况,avl树很好用. 红黑树牺牲了平衡性,但是它的统计性能更优(综合增删改查所有的操作). 红黑树java ...

  8. maven 如何将自己的jar包添加到本地仓库

    1 准备一个需要添加到本地仓库的jar包 我这里准备了一个名为mail.jar 的jar包,放到E:\Install Files目录下面 2 下面演示如何将准备的jar包添加到本地仓库 1 语法 mv ...

  9. GitKraken使用教程-基础部分(3)

    5. 克隆服务器上的项目 首先,返回主界面,点击File => Clone Repo,选择 Clone with URL,如下图: 图 5‑1 SSH方式克隆仓库界面 1) SSH 方式连接仓库 ...

  10. HDU 4009——Transfer water——————【最小树形图、不定根】

    Transfer water Time Limit:3000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64u Subm ...