手把手教你用Node.js爬虫爬取网站数据的方法


Posted in Javascript onJuly 05, 2018

开始之前请先确保自己安装了Node.js环境,还没有安装的的童鞋请看一下安装教程......

直接开始吧

1.在项目文件夹安装两个必须的依赖包

npm install superagent --save-dev

SuperAgent(官网是这样解释的)

-----SuperAgent is light-weight progressive ajax API crafted for flexibility, readability, and a low learning curve after being frustrated with many of the existing request APIs. It also works with Node.js!

-----superagent 是一个轻量的,渐进式的ajax api,可读性好,学习曲线低,内部依赖nodejs原生的请求api,适用于nodejs环境下

npm install cheerio --save-dev

Cheerio

-----cheerio是nodejs的抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现。适合各种Web爬虫程序。相当于node.js中的jQuery

2.新建  crawler.js  文件

//导入依赖包
const http    = require("http");
const path    = require("path");
const url    = require("url");
const fs     = require("fs");
 
const superagent = require("superagent");
const cheerio  = require("cheerio");
3.看注释啦(这里爬取的是boss直聘网站的数据)
superagent
  .get("https://www.zhipin.com/job_detail/?city=100010000&source=10&query=%E5%89%8D%E7%AB%AF")
  .end((error,response)=>{
    //获取页面文档数据
    var content = response.text;
    //cheerio也就是nodejs下的jQuery 将整个文档包装成一个集合,定义一个变量$接收
    var $ = cheerio.load(content);
    //定义一个空数组,用来接收数据
    var result=[];
    //分析文档结构 先获取每个li 再遍历里面的内容(此时每个li里面就存放着我们想要获取的数据)
    $(".job-list li .job-primary").each((index,value)=>{
      //地址和类型为一行显示,需要用到字符串截取
      //地址
      let address=$(value).find(".info-primary").children().eq(1).html();
      //类型
      let type=$(value).find(".info-company p").html();
      //解码
      address=unescape(address.replace(/&#x/g,'%u').replace(/;/g,''));
      type=unescape(type.replace(/&#x/g,'%u').replace(/;/g,''))
      //字符串截取
      let addressArr=address.split('<em class="vline"></em>');
      let typeArr=type.split('<em class="vline"></em>');
      //将获取的数据以对象的形式添加到数组中
      result.push({
        title:$(value).find(".name .job-title").text(),
        money:$(value).find(".name .red").text(),
        address:addressArr,
        company:$(value).find(".info-company a").text(),
        type:typeArr,
        position:$(value).find(".info-publis .name").text(),
        txImg:$(value).find(".info-publis img").attr("src"),
        time:$(value).find(".info-publis p").text()
      });
      // console.log(typeof $(value).find(".info-primary").children().eq(1).html());
    });
    //将数组转换成字符串
    result=JSON.stringify(result);
    //将数组输出到json文件里 刷新目录 即可看到当前文件夹多出一个boss.json文件(打开boss.json文件,ctrl+A全选之后 ctrl+K,再Ctrl+F即可将json文件自动排版)
    fs.writeFile("boss.json",result,"utf-8",(error)=>{
      //监听错误,如正常输出,则打印null
      if(error==null){
        console.log("恭喜您,数据爬取成功!请打开json文件,先Ctrl+A,再Ctrl+K,最后Ctrl+F格式化后查看json文件(仅限Visual Studio Code编辑器)");
      }
    });
  });

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

Javascript 相关文章推荐
JavaScript静态的动态
Sep 18 Javascript
模仿jQuery each函数的链式调用
Jul 22 Javascript
js保存当前路径(cookies记录)
Dec 14 Javascript
JS打开新窗口的2种方式
Apr 18 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
Jun 24 Javascript
利用React-router+Webpack快速构建react程序
Oct 27 Javascript
JavaScript使用ZeroClipboard操作剪切板
May 10 Javascript
node使用Koa2搭建web项目的方法
Oct 17 Javascript
简述vue状态管理模式之vuex
Aug 29 Javascript
nuxt.js中间件实现拦截权限判断的方法
Nov 21 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
Javascript实现简易天数计算器
May 18 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
Jul 04 #Javascript
vue两个组件间值的传递或修改方式
Jul 04 #Javascript
jQuery实现炫丽的3d旋转星空效果
Jul 04 #jQuery
jQuery实现table表格checkbox全选的方法分析
Jul 04 #jQuery
React组件内事件传参实现tab切换的示例代码
Jul 04 #Javascript
解决vue项目打包后提示图片文件路径错误的问题
Jul 04 #Javascript
浅谈在react中如何实现扫码枪输入
Jul 04 #Javascript
You might like
PHP 采集获取指定网址的内容
2010/01/05 PHP
php注销代码(session注销)
2012/05/31 PHP
PHP Session机制简介及用法
2014/08/19 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
Javascript计算时间差的函数分享
2011/07/04 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python构造函数及解构函数介绍
2015/02/26 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
英国领先的男士美容护发用品公司:Mankind
2016/08/31 全球购物
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
新员工培训个人的自我评价
2013/10/09 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
教师自我反思材料
2014/02/14 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
推销搭讪开场白
2015/05/28 职场文书
Java死锁的排查
2022/05/11 Java/Android