手把手教你用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 相关文章推荐
js 判断checkbox是否选中的实现代码
Nov 23 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
May 07 Javascript
JSON无限折叠菜单编写实例
Dec 16 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 Javascript
JavaScript严格模式详解
Nov 18 Javascript
微信小程序教程系列之新建页面(4)
Apr 17 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
Oct 24 Javascript
微信小程序实现动态获取元素宽高的方法分析
Dec 10 Javascript
vue+iview动态渲染表格详解
Mar 19 Javascript
vue通过数据过滤实现表格合并
Nov 30 Javascript
react国际化化插件react-i18n-auto使用详解
Mar 31 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中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
简单实现js轮播图效果
2017/07/14 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
python 合并文件的具体实例
2013/08/08 Python
跟老齐学Python之数据类型总结
2014/09/24 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
Python高并发和多线程有什么关系
2020/11/14 Python
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
应用电子专业学生的自我评价
2013/10/16 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技