基于node.js制作简单爬虫教程


Posted in Javascript onJune 29, 2017

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

目标:爬取 http://tweixin.yueyishujia.com/webapp/build/html/ 网站的所有门店发型师的基本信息。

思路:访问上述网站,通过chrome浏览器的network对网页内容分析,找到获取各个门店发型师的接口,对参数及返回数据进行分析,遍历所有门店的所有发型师,直到遍历完毕,同事将信息存储到本地。

步骤一:安装node.js

下载并安装node,此步骤比较简单就不详细解释了,有问题的可以直接问一下度娘。

步骤二:建立工程

1)打开dos命令条,cd进入想要创建项目的路径(我将此项目直接放在了E盘,以下皆以此路径为例);

2)mkdir node (创建一个文件夹用来存放项目,我这里取名为node);

3)cd 进入名为node的文件夹,并执行npm init初始化工程(期间会让填写一些信息,我是直接回车的);

步骤三:创建爬取到的数据存放的文件夹

1)创建data文件夹用来存放发型师基本信息;

2)创建image文件夹用来存储发型师头像图片;

此时工程下文件如下: 

基于node.js制作简单爬虫教程

步骤四:安装第三方依赖包(fs是内置模块,不需要单独安装)

1)npm install cheerio ?save

2)npm install superagent ?save

3)npm install async ?save

4)npm install request ?save

分别简单解释一下上面安装的依赖包:

cheerio:是nodejs的抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现,则能够对请求结果进行解析,解析方式和jQuery的解析方式几乎完全相同;

superagent:能够实现主动发起get/post/delete等请求;

async:async模块是为了解决嵌套金字塔,和异步流程控制而生,由于nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦。Async的流程控制就是为了简化这些操作;

request:有了这个模块,http请求变的超简单,Request使用简单,同时支持https和重定向; 

步骤五:编写爬虫程序代码

打开hz.js,编写代码:

var superagent = require('superagent'); 
var cheerio = require('cheerio');
var async = require('async');
var fs = require('fs');
var request = require('request');
var page=1; //获取发型师处有分页功能,所以用该变量控制分页
var num = 0;//爬取到的信息总条数
var storeid = 1;//门店ID
console.log('爬虫程序开始运行......');

function fetchPage(x) {   //封装函数
  startRequest(x); 
}
function startRequest(x) {

  superagent
    .post('http://tweixin.yueyishujia.com/v2/store/designer.json')
    .send({ 
      // 请求的表单信息Form data
      page : x, 
      storeid : storeid
    })
      // Http请求的Header信息
    .set('Accept', 'application/json, text/javascript, */*; q=0.01')
    .set('Content-Type','application/x-www-form-urlencoded; charset=UTF-8')
    .end(function(err, res){     
      // 请求返回后的处理
      // 将response中返回的结果转换成JSON对象
      if(err){
        console.log(err);
      }else{
        var designJson = JSON.parse(res.text);
        var deslist = designJson.data.designerlist;
        if(deslist.length > 0){
          num += deslist.length;
          // 并发遍历deslist对象
          async.mapLimit(deslist, 5, 
            function (hair, callback) {
            // 对每个对象的处理逻辑
               console.log('...正在抓取数据ID:'+hair.id+'----发型师:'+hair.name);
               saveImg(hair,callback);
            }, 
            function (err, result) {
              console.log('...累计抓取的信息数→→' + num);
            }
          );
          page++;
          fetchPage(page);
        }else{
          if(page == 1){
            console.log('...爬虫程序运行结束~~~~~~~');
            console.log('...本次共爬取数据'+num+'条...');
            return;
          }
          storeid += 1;
          page = 1;
          fetchPage(page);
        }
      }
    });
} 
fetchPage(page);
function saveImg(hair,callback){
  // 存储图片
  var img_filename = hair.store.name+'-'+hair.name + '.png';

  var img_src = 'http://photo.yueyishujia.com:8112' + hair.avatar; //获取图片的url

  //采用request模块,向服务器发起一次请求,获取图片资源
  request.head(img_src,function(err,res,body){
    if(err){
      console.log(err);
    }else{
        request(img_src).pipe(fs.createWriteStream('./image/' + img_filename));   //通过流的方式,把图片写到本地/image目录下,并用发型师的姓名和所属门店作为图片的名称。
        console.log('...存储id='+hair.id+'相关图片成功!');
    }
  });
  // 存储照片相关信息
  var html = '姓名:'+hair.name+'<br>职业:'+hair.jobtype+'<br>职业等级:'+hair.jobtitle+'<br>简介:'+hair.simpleinfo+'<br>个性签名:'+hair.info+'<br>剪发价格:'+hair.cutmoney+'元<br>店名:'+hair.store.name+'<br>地址:'+hair.store.location+'<br>联系方式:'+hair.telephone+'<br>头像:<img src='+img_src+' style="width:200px;height:200px;">';
  fs.appendFile('./data/' +hair.store.name+'-'+ hair.name + '.html', html, 'utf-8', function (err) {
    if (err) {
      console.log(err);
    }
  });
  callback(null, hair);
}

步骤六:运行爬虫程序

输入node hz.js命令运行爬虫程序,效果图如下:

基于node.js制作简单爬虫教程

运行成功后,发型师基本信息以html文件的形式存储在data文件夹中,发型师头像图片存储在image文件夹下:

基于node.js制作简单爬虫教程

基于node.js制作简单爬虫教程

 后记:到此一款基于node.js制作的简单爬虫就大功告成了,由于我也是初学者,好多地方也不是很理解,但好在是自己完成了,不足之处敬请谅解。

代码下载地址:https://github.com/yanglei0323/nodeCrawler

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
this[] 指的是什么内容 讨论
Mar 24 Javascript
一个用js实现控制台控件的代码
Sep 04 Javascript
JS类的封装及实现代码
Dec 02 Javascript
javascript ajax 仿百度分页函数
Oct 29 Javascript
使用js实现的简单拖拽效果
Mar 18 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
微信小程序 MINA文件结构
Oct 17 Javascript
百度搜索框智能提示案例jsonp
Nov 28 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
Apr 17 Javascript
解决VueCil代理本地proxytable无效报错404的问题
Nov 07 Javascript
JavaScript算法教程之sku(库存量单位)详解
Jun 29 #Javascript
详解webpack自动生成html页面
Jun 29 #Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
Jun 29 #Javascript
详解webpack分包及异步加载套路
Jun 29 #Javascript
JavaScript之map reduce_动力节点Java学院整理
Jun 29 #Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
Jun 29 #Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 #Javascript
You might like
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
JavaScript 空位补零实现代码
2010/02/26 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
vue与django集成打包的实现方法
2019/11/11 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
解读python logging模块的使用方法
2018/04/17 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
python实发邮件实例详解
2019/11/11 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
微笑面对生活演讲稿
2014/09/23 职场文书
2016小学新学期寄语
2015/12/04 职场文书
Mysql排序的特性详情
2021/11/01 MySQL
Golang实现可重入锁的示例代码
2022/05/25 Golang