手把手教你用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 相关文章推荐
PNG背景在不同浏览器下的应用
Jun 22 Javascript
js 操作select相关方法函数
Dec 06 Javascript
JQuery开发的数独游戏代码
Oct 29 Javascript
ASP中Sub和Function的区别说明
Aug 30 Javascript
Javascript控制页面链接在新窗口打开具体方法
Aug 16 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 Javascript
javascript实现图像循环明暗变化的方法
Feb 25 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
Mar 13 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
Apr 03 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
Feb 22 Javascript
Angular浏览器插件Batarang介绍及使用
Feb 07 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
Jul 28 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/04/05 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
PHP 验证登陆类分享
2015/03/13 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
2017/01/20 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
详解python3实现的web端json通信协议
2016/12/29 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
Flask框架web开发之零基础入门
2018/12/10 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
优秀求职自荐信怎样写
2013/12/18 职场文书
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
导游词格式
2015/02/13 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书