参考博客:手把手教你做爬虫—基于NodeJs
第一个nodejs爬虫:爬取豆瓣电影图片

引入模块

1.node 必须安装
2.http模块、fs模块都是内置的包,不需要额外添加
cheerio包,request包和async包,需要用npm或cnpm安装

cheerio包:是一个有着jQuery类似语法的文档解析模块,可以简单理解为nodejs中的jQuery。
async包:是一个异步流程控制模块用来控制并发,因为很多网站都有并发连接数量的限制,所以当请求发送太快的时候会导致返回值为空或报错。更有甚者,有些网站可能因为你发出的并发连接数量过多而当你是在恶意请求,封掉你的ip。

cnpm i cheerio -S
cnpm i request -S
cnpm i async -S

代码

创建index.js

var http = require('https'); //使用https模块(内置的包)
var fs = require('fs');//文件读写内置的包
var cheerio = require('cheerio');//jquery写法获取所得页面dom元素(须安装)
var request = require('request');//发送request请求(须安装)
var async = require('async');//控制并发(须安装)
var i = 0;
var url = "https://movie.douban.com/subject/1889243/?from=subject-page";
//判断data是否存在,创建data文件夹存储文本
fs.exists("./data", function (exists) {if (exists) {console.log("data目录存在")} else {console.log("data目录不存在")fs.mkdir('./data/', function (err) {if (err) {return console.error(err);}console.log("data目录创建成功。");});}
});
//判断image是否存在,不存在就创建image文件夹存储图片
fs.exists("./image", function (exists) {if (exists) {console.log("image目录存在")} else {console.log("image目录不存在")fs.mkdir('./image/', function (err) {if (err) {return console.error(err);}console.log("image目录创建成功。");});}
});fetchPage(url); //主程序开始运行//初始url
function fetchPage(x) { //封装一层函数,方便递归调用startRequest(x);
}function startRequest(x) {//采用http模块向服务器发起一次get请求      http.get(x, function (res) { //get到x网址,成功执行回调函数var html = ''; //用来存储请求网页的整个html内容res.setEncoding('utf-8'); //防止中文乱码//监听data事件,每次取一块数据res.on('data', function (chunk) {html += chunk;});//监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数res.on('end', function () {var $ = cheerio.load(html); //采用cheerio模块解析htmlvar news_item = {//获取电影的标题title: $('.related-info h2 i').text().trim(),//i是用来判断获取页数i: i = i + 1,};console.log(news_item); //打印新闻信息var news_title = $('.related-info h2 i').text().trim();savedContent($, news_title); //存储每篇文章的内容及文章标题savedImg($, news_title); //存储每篇文章的图片及图片标题//下一篇电影的urlnextLink = $(".recommendations-bd dl:last-child dd a").attr('href');if (i < 10) { //爬取10页fetchPage(nextLink);}});}).on('error', function (err) { //http模块的on data,on end ,on error事件console.log(err);});}
//存储每篇文章的内容
function savedContent($, news_title) {var text = '';$('#link-report span').each(function (index, item) {text += $(this).text();text += '\n';})//将新闻文本内容一段一段添加到/data文件夹下,并用新闻的标题来命名文件fs.appendFile('./data/' + news_title + Math.random() + '.txt', text, 'utf-8', function (err) {if (err) {console.log(err);}});
}
//储所爬取到的图片资源
function savedImg($, news_title) {var fileName = './image/' + news_title + Math.random() + '/';var imgList = []; // 存储下载图片列表fs.mkdir(fileName, function (err) {if (err) {return console.error(err);}console.log("目录创建成功。");});$('#recommendations img').each(function (index, item) {var img_title = $(this).text().trim(); //获取图片的标题if (img_title.length > 35 || img_title == "") { //图片标题太长img_title = "图片";}var img_filename = img_title + Math.random() + '.jpg';var img_src = $(this).attr('src'); //获取图片的urlimgList.push({img_title: img_title,img_filename: img_filename,img_src: img_src});});//并发请求一次发送五个async.mapLimit(imgList, 5, function (obj, callback) {//采用request模块,向服务器发起一次请求,获取图片资源request.head(obj.img_src, function (err, res, body) {if (err) {console.log(err);}request(obj.img_src).pipe(fs.createWriteStream(fileName + obj.news_title + '---' + obj.img_filename));//通过流的方式,把图片写到本地/image目录下,并用标题和图片的标题作为图片的名称。callback(null);});}, function (err, result) {if (err) {console.log(err);} else {// console.log(result);<=会输出一个有2万多个“successful”字符串的数组console.log("全部已下载完毕!");}});
}

运行

node index.js

结果


福利(获取妹子图片)

var http = require('https'); //使用https模块
var fs = require('fs');//文件读写
var cheerio = require('cheerio');//jquery写法获取所得页面dom元素
var request = require('request');//发送request请求
var url = "https://www.nanrentu.cc/mntp/swmn.html";
//判断image是否存在,不存在就创建image文件夹存储图片
fs.exists("./image", function (exists) {if (exists) {console.log("image目录存在")} else {console.log("image目录不存在")fs.mkdir('./image/', function (err) {if (err) {return console.error(err);}console.log("image目录创建成功。");});}
});startRequest(url); //主程序开始运行function startRequest(x) {//采用http模块向服务器发起一次get请求      http.get(x, function (res) { //get到x网址,成功执行回调函数var html = ''; //用来存储请求网页的整个html内容res.setEncoding('utf-8'); //防止中文乱码//监听data事件,每次取一块数据res.on('data', function (chunk) {html += chunk;});//监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数res.on('end', function () {var $ = cheerio.load(html); //采用cheerio模块解析html//把跳转页面的图片的跳转地址取出来,传到详情页面$('.h-piclist li').each(function (index, item) {if (index < 10) {var url = $(this).find('a').attr('href');var text = $(this).find('p').text();console.log(text);var path = './image/' + text + Math.random() + '/';fs.mkdir(path, function (err) {if (err) {return console.error(err);}});enterPage(url, path);}});});}).on('error', function (err) { //http模块的on data,on end ,on error事件console.log(err);});
}
//进入详情页
function enterPage(x, path) {//采用http模块向服务器发起一次get请求     http.get(x, function (res) { //get到x网址,成功执行回调函数var html = ''; //用来存储请求网页的整个html内容res.setEncoding('utf-8'); //防止中文乱码//监听data事件,每次取一块数据res.on('data', function (chunk) {html += chunk;});//监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数res.on('end', function () {var $ = cheerio.load(html); //采用cheerio模块解析htmlsavedImg($, path); //存储每篇文章的图片及图片标题var flag = false;//获取下一页的地址,然后递归跳转$('.page li').each(function (index, item) {if ($(this).find('a').text() === '下一页') {flag = true;url = $(this).find('a').attr('href');}});if (flag) {enterPage('https://www.nanrentu.cc' + url, path);}});}).on('error', function (err) { //http模块的on data,on end ,on error事件console.log(err);});
}
//存储所爬取到的图片资源
function savedImg($, path) {$('.info-pic-list img').each(function (index, item) {var img_title = $(this).attr('alt'); //获取图片的标题var img_filename = img_title + Math.random() + '.jpg';var img_src = $(this).attr('src'); //获取图片的urlconsole.log(img_src);//采用request模块,向服务器发起一次请求,获取图片资源request.head(img_src, function (err, res, body) {if (err) {console.log(err);}});request(img_src).pipe(fs.createWriteStream(path + img_filename));//通过流的方式,把图片写到本地/image目录下,并用标题和图片的标题作为图片的名称。})
}

基于NodeJs的爬虫相关推荐

  1. 基于NodeJS的视频网站爬虫工具

    闲暇时间写了一个基于nodejs的爬虫工具,可以对视频网址等站点进行爬取数据 示例站点为dilidili动漫网 http.cheerio用于获取网站Dom数据 exceljs用于生成excel文件 C ...

  2. 基于 Node.js 爬虫的数据 API,搭建一套属于自己的 API 数据

    SpliderApi https://github.com/ecitlm/Spl... 基于nodejs 的爬虫 API接口项目,包括前端开发日报.知乎日报.前端top框架排行.妹纸福利.搞笑视频/ ...

  3. 基于nodejs爬虫程序下载

    node-crawler 一个基于nodejs的网站采集服务器 可部署在任何服务器上远程调用 DEMO 发送请求 run npm dev POST: /scan {"url": & ...

  4. 基于nodejs的二手物物交换平台【毕业设计源码】

    目录 一.程序介绍: 三.文档目录: 四.运行截图: 五.数据库表: 六.代码展示: 七.更多学习目录: 八.互动留言 一.程序介绍: 文档:开发技术文档.参考LW.答辩PPT,部分项目另有其他文档 ...

  5. Sequelize 4.43.0 发布,基于 Nodejs 的异步 ORM 框架

    Sequelize 4.43.0 发布了,Sequelize 是一款基于 Nodejs 的异步 ORM 框架,它同时支持 PostgreSQL.MySQL.SQLite 和 MSSQL 多种数据库,很 ...

  6. js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法

    本篇是使用 nodejs 写爬虫系列教程的第一篇, 介绍了使用 nodejs 写爬虫过程中常用的模块和一些必须掌握的 js 语法 <!-- more --> 常用模块 常用模块有以下几个: ...

  7. Sequelize 4.42.1 发布,基于 Nodejs 的异步 ORM 框架

    百度智能云 云生态狂欢季 热门云产品1折起>>>   Sequelize 4.42.1 发布了,Sequelize 是一款基于 Nodejs 的异步 ORM 框架,它同时支持 Pos ...

  8. JavaScript数据结构与算法——列表详解(下),基于Nodejs实现一个列表应用

    1.上篇回顾: 上篇我们实现了一个列表类,并添加了一些属性,实现了比较多的方法,本文章将与大家一起使用列表实现一个图书借阅查询系统.需要使用JavaScript数据结构与算法--列表详解(上)中写好的 ...

  9. [Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建

    一.前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程.该工程是基于nodejs和redis写成的一个简单的工 ...

最新文章

  1. Go 语言编程 — 程序运行环境
  2. Buy Tickets(poj 2828)
  3. Python_Mix*OS模块,序列化模块种的json,pickle
  4. hybris导出系统已有数据的两种方式
  5. HDU -2546饭卡(01背包+贪心)
  6. Matlab与线性代数
  7. 【转】SSH中 整合spring和proxool 连接池
  8. 中如何构造有参和无惨_混凝土二次构造柱输送泵可提升施工效率
  9. unity导出fbx_使用Blender和Unity创建一个简单Low Poly的模型(一)
  10. python身份证号掩盖出生日期的代码_Python实现第一、二代公民身份证号码有效性校验...
  11. JAVA CLASS混淆工具:RetroGuard(已无法下载)
  12. php ms5解密,「phpmd5解密」解析php混淆加密解密的手段
  13. 使用双重循环实现五子棋游戏棋盘的绘制
  14. verilog行为级建模(1)
  15. 本地化管理的表空间的创建相关参数说明
  16. react学习—高阶组件HOC
  17. [洛谷] P2357 守墓人
  18. sql中完全依赖,部分依赖,传递依赖关系
  19. Visual Studio Code设置代码自动换行
  20. 查询各科分数最高的科目名称,学生学号,姓名,分数,排名

热门文章

  1. 利用计算机设计比率分析模型,计算机财务管理.pdf
  2. Aegisub设置字体透明度
  3. java向上转型_Java向上转型
  4. 可达性统计(拓扑排序逆推)
  5. CCF201812-2 小明放学(JAVA)
  6. 安卓常用框架、模块、软件
  7. 华为助力南昌轨道“长龙”4号线实现南北游走
  8. 怎样才能让身体更加健康?
  9. 网上酒店客房预定系统数据库设计
  10. PanGu STM32MP开发板更新固件