手把手教你用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 call和apply方法
Nov 24 Javascript
JS创建类和对象的两种不同方式
Aug 08 Javascript
jQuery实现瀑布流的取巧做法分享
Jan 12 Javascript
Angularjs过滤器使用详解
May 25 Javascript
微信小程序入门教程
Nov 18 Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 Javascript
AngularJS中下拉框的高级用法示例
Oct 11 Javascript
vue2实现数据请求显示loading图
Nov 28 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 Javascript
js计算最大公约数和最小公倍数代码实例
Sep 11 Javascript
Vue实现计算器计算效果
Aug 17 Javascript
TS 类型兼容教程示例详解
Sep 23 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单例模式实现(对象只被创建一次)
2012/12/05 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
用jquery来定位
2007/02/20 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
python删除文件示例分享
2014/01/28 Python
Python中__call__用法实例
2014/08/29 Python
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
Django 限制访问频率的思路详解
2019/12/24 Python
最小二乘法及其python实现详解
2020/02/24 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
python打包生成so文件的实现
2020/10/30 Python
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
领导干部考察材料
2014/02/08 职场文书
投资意向书
2014/07/30 职场文书
先进员工事迹材料
2014/12/20 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
校长新学期寄语2016
2015/12/04 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python
MySQL如何解决幻读问题
2021/08/07 MySQL
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers