急需运用的库,供给贯彻的功能

抓取指标:正是本人要好的博客:http://www.cnblogs.com/ghostwu/

抓取目的:正是自家本身的博客:http://www.cnblogs.com/ghostwu/

没接触过,试着容易学一下,从头发轫;

亟待完成的法力:

内需完成的成效:

参考那一个课程:https://github.com/alsotang/node-lessons/tree/master/lesson0

抓取博客全部的稿子标题,超链接,文摘,发表时间

抓取博客全体的稿子标题,超链接,文章摘要,揭橥时间

一 、搭建环境:

亟需运用的库:

亟待选取的库:

     
① 、搭建Node.js环境好像超越50%是基于linux系统的,windows系统好像不受欢迎,不可能,就在windows下边装三个centos系统;

node.js自带的http库

node.js自带的http库

      ② 、安装nvm (Node Version Manager) ;
按下边包车型大巴课程,输入指令后如图所示:(应该要重启下终端)

其三方库:cheerio,这些库正是用来处理dom节点的,他的用法大致跟jquery用法一模一样,所以有了那么些利器,写1个爬虫就非凡简单

其三方库:cheerio,那个库正是用来处理dom节点的,他的用法差不多跟jquery用法一模一样,所以有了那些利器,写一个爬虫就非凡容易

          图片 1

未焚徙薪干活:

预备干活:

       ③ 、安装Node.js; 重启终端,也服从教程安装0.12这么些版本;

1,npm init –yes 初始化package.json

1,npm init –yes 初始化package.json

         图片 2

2,安装cheerio:npm install cheerio
–save-dev

2,安装cheerio:npm install cheerio
–save-dev

     正在安装……有速度显示;作者去
卡到了82.1%,有五秒钟了!只能重启终端,继续下载完毕了;(卡的时候要重启?)

贯彻的靶子,是要把每篇作品供给抓取的一部分( 抓取小说标题,超链接,文摘,公布时间
)整理成贰个对象, 放在数组中,如:

落实的对象,是要把每篇文章须求抓取的局地( 抓取小说标题,超链接,文摘,公布时间
)整理成1个目的, 放在数组中,如:

           图片 3

[ { title: '[置顶][js高手之路]从零开始打造一个javascript开源框架gdom与插件开发免费视频教程
连载中',
    url: 'http://www.cnblogs.com/ghostwu/p/7470038.html',
    entry: '摘要: 百度网盘下载地址:https://pan.baidu.com/s/1kULNXOF 优酷土豆观看地址:htt
p://v.youku.com/v_show/id_XMzAwNTY2MTE0MA==.html?spm=a2h0j.8191423.playlist_content.5!3~5~
5~A&&f',
    listTime: '2017-09-05 17:08' },
  { title: '[js高手之路]Vue2.0基于vue-cli+webpack Vuex用法详解',
    url: 'http://www.cnblogs.com/ghostwu/p/7521097.html',
    entry: '摘要: 在这之前,我已经分享过组件与组件的通信机制以及父子组件之间的通信机制,而
我们的vuex就是为了解决组件通信问题的 vuex是什么东东呢? 组件通信的本质其实就是在组件之间传
递数据或组件的状态(这里将数据和状态统称为状态),但可以看到如果我们通过最基本的方式来进行
通信,一旦需要管理的状态多了,代码就会',
    listTime: '2017-09-14 15:51' },
  { title: '[js高手之路]Vue2.0基于vue-cli+webpack同级组件之间的通信教程',
    url: 'http://www.cnblogs.com/ghostwu/p/7518158.html',
    entry: '摘要: 我们接着上文继续,本文我们讲解兄弟组件的通信,项目结构还是跟上文一样. 在
src/assets目录下建立文件EventHandler.js,该文件的作用在于给同级组件之间传递事件 EventHandl
er.js代码: 2,在Components目录下新建一个组件Brother1.vue 。通过Eve',
    listTime: '2017-09-13 22:49' },
   ]
[ { title: '[置顶][js高手之路]从零开始打造一个javascript开源框架gdom与插件开发免费视频教程
连载中',
    url: 'http://www.cnblogs.com/ghostwu/p/7470038.html',
    entry: '摘要: 百度网盘下载地址:https://pan.baidu.com/s/1kULNXOF 优酷土豆观看地址:htt
p://v.youku.com/v_show/id_XMzAwNTY2MTE0MA==.html?spm=a2h0j.8191423.playlist_content.5!3~5~
5~A&&f',
    listTime: '2017-09-05 17:08' },
  { title: '[js高手之路]Vue2.0基于vue-cli+webpack Vuex用法详解',
    url: 'http://www.cnblogs.com/ghostwu/p/7521097.html',
    entry: '摘要: 在这之前,我已经分享过组件与组件的通信机制以及父子组件之间的通信机制,而
我们的vuex就是为了解决组件通信问题的 vuex是什么东东呢? 组件通信的本质其实就是在组件之间传
递数据或组件的状态(这里将数据和状态统称为状态),但可以看到如果我们通过最基本的方式来进行
通信,一旦需要管理的状态多了,代码就会',
    listTime: '2017-09-14 15:51' },
  { title: '[js高手之路]Vue2.0基于vue-cli+webpack同级组件之间的通信教程',
    url: 'http://www.cnblogs.com/ghostwu/p/7518158.html',
    entry: '摘要: 我们接着上文继续,本文我们讲解兄弟组件的通信,项目结构还是跟上文一样. 在
src/assets目录下建立文件EventHandler.js,该文件的作用在于给同级组件之间传递事件 EventHandl
er.js代码: 2,在Components目录下新建一个组件Brother1.vue 。通过Eve',
    listTime: '2017-09-13 22:49' },
   ]

  ④ 、安装到位,运行node; 试了试,好像要先输入nvm use 0.12
命令;原来是从未运维$ nvm alias default 0.12 这么些命令;

 思路讲解:

 思路讲解:

         图片 4 
 设置了默许值后: 图片 5   

1,获取目标地方:http://www.cnblogs.com/ghostwu/ 所有的html内容

1,获取目的地方:http://www.cnblogs.com/ghostwu/ 所有的html内容

     
 图片 6

2,提取全数的篇章html内容

2,提取全体的篇章html内容

 

3,提取每篇小说上边对应的( 小说标题,超链接,文摘,发表时间 )

3,提取每篇小说上边对应的( 作品标题,超链接,文摘,宣布时间 )

  二 、多个最简便易行的例证:

 1 var http = require('http');
 2 var cheerio = require('cheerio');
 3 
 4 var url = 'http://www.cnblogs.com/ghostwu/';
 5 
 6 function filterHtml(html) {
 7     var $ = cheerio.load(html);
 8     var arcList = [];
 9     var aPost = $("#content").find(".post-list-item");
10     aPost.each(function () {
11         var ele = $(this);
12         var title = ele.find("h2 a").text();
13         var url = ele.find("h2 a").attr("href");
14         ele.find(".c_b_p_desc a").remove();
15         var entry = ele.find(".c_b_p_desc").text();
16         ele.find("small a").remove();
17         var listTime = ele.find("small").text();
18         var re = /\d{4}-\d{2}-\d{2}\s*\d{2}[:]\d{2}/;
19         listTime = listTime.match( re )[0];
20         arcList.push({
21             title: title,
22             url: url,
23             entry: entry,
24             listTime: listTime
25         });
26     });
27     return arcList;
28 }
29 
30 http.get(url, function (res) {
31     var html = '';
32     var arcList = [];
33     // var arcInfo = {};
34     res.on('data', function (chunk) {
35         html += chunk;
36     });
37     res.on('end', function () {
38         arcList = filterHtml( html ); 
39         console.log( arcList );
40     });
41 });
 1 var http = require('http');
 2 var cheerio = require('cheerio');
 3 
 4 var url = 'http://www.cnblogs.com/ghostwu/';
 5 
 6 function filterHtml(html) {
 7     var $ = cheerio.load(html);
 8     var arcList = [];
 9     var aPost = $("#content").find(".post-list-item");
10     aPost.each(function () {
11         var ele = $(this);
12         var title = ele.find("h2 a").text();
13         var url = ele.find("h2 a").attr("href");
14         ele.find(".c_b_p_desc a").remove();
15         var entry = ele.find(".c_b_p_desc").text();
16         ele.find("small a").remove();
17         var listTime = ele.find("small").text();
18         var re = /\d{4}-\d{2}-\d{2}\s*\d{2}[:]\d{2}/;
19         listTime = listTime.match( re )[0];
20         arcList.push({
21             title: title,
22             url: url,
23             entry: entry,
24             listTime: listTime
25         });
26     });
27     return arcList;
28 }
29 
30 http.get(url, function (res) {
31     var html = '';
32     var arcList = [];
33     // var arcInfo = {};
34     res.on('data', function (chunk) {
35         html += chunk;
36     });
37     res.on('end', function () {
38         arcList = filterHtml( html ); 
39         console.log( arcList );
40     });
41 });

       一 、首先必要用npm(Node Package Manager) 安装叁个框架Express;
 不懂,先遵照教程来:

有多少个十分重要的地方要上课下:

有多少个首要的地点要上课下:

            http://registry.cnpmjs.org
那几个地址被内网禁了,报互连网错误。所以换三个试试 http://registry.cnpmjs.org;果然可以!

1,res.on( ‘data’, function(){} ) 

1,res.on( ‘data’, function(){} ) 

            图片 7

http模块发送get请求之后,就会接连不断的抓取指标网页的源代码内容,
所以,笔者在on中监听data事件,
chunk便是传输的数额,把那么些数据增进到html那些变量,
当数据传输完今后就会触发end事件,你能够在end事件中打字与印刷一下console.log(
html ) 就能窥见,他正是指标地址的兼具html源代码,那样就化解了大家的首先个难题:获取目的地址:http://www.cnblogs.com/ghostwu/
所有的html内容

http模块发送get请求之后,就会络绎不绝 蜂拥而上的抓取目的网页的源代码内容,
所以,小编在on中监听data事件,
chunk正是传输的多少,把那一个数据增进到html这几个变量,
当数据传输完今后就会触发end事件,你能够在end事件中打字与印刷一下console.log(
html ) 就能发现,他正是目的地方的全部html源代码,那样就缓解了大家的首先个难题:获取目的地方:http://www.cnblogs.com/ghostwu/
所有的html内容

     
二 、开端写js代码,实现叁个服务器,端口贰仟,访问地址http://localhost:3000

2,有了一体化的html内容之后,接下去本身封装了一个函数filterHTML用来过滤作者所急需的结果(
每篇作品的消息 )

2,有了一体化的html内容之后,接下去自个儿封装了多少个函数filterHTML用来过滤笔者所必要的结果(
每篇小说的音讯 )

// 这句的意思就是引入 `express` 模块,并将它赋予 `express` 这个变量等待使用。
var express = require('express');
// 调用 express 实例,它是一个函数,不带参数调用时,会返回一个 express 实例,将这个变量赋予 app 变量。
var app = express();

// app 本身有很多方法,其中包括最常用的 get、post、put/patch、delete,在这里我们调用其中的 get 方法,为我们的 `/` 路径指定一个 handler 函数。
// 这个 handler 函数会接收 req 和 res 两个对象,他们分别是请求的 request 和 response。
// request 中包含了浏览器传来的各种信息,比如 query 啊,body 啊,headers 啊之类的,都可以通过 req 对象访问到。
// res 对象,我们一般不从里面取信息,而是通过它来定制我们向浏览器输出的信息,比如 header 信息,比如想要向浏览器输出的内容。这里我们调用了它的 #send 方法,向浏览器输出一个字符串。
app.get('/', function (req, res) { 

3,var $ = cheerio.load(html);
把html内容通过cheerio的load方法加载进来,就能够用cheerio的节点操作了,为了亲和jquery的操作,作者用欧元符号$保存了这几个文书档案对象

3,var $ = cheerio.load(html);
把html内容通过cheerio的load方法加载进来,就足以用cheerio的节点操作了,为了亲和jquery的操作,笔者用美金符号$保存了那些文书档案对象

  //当有参数时  http://localhost:3000/?q=niu 用如下代码获取;

4,var aPost = $(“#content”).find(“.post-list-item”);
这几个是怀有的稿子节点新闻,得到后来,通过each方法
挨个遍历并抓取供给的音信,整理成靶子,然后放在2个数组中

4,var aPost = $(“#content”).find(“.post-list-item”);
那么些是拥有的小说节点新闻,得到以往,通过each方法
挨个遍历并抓取须要的新闻,整理成靶子,然后放在贰个数组中

  //var param = req.query.q;

1  arcList.push({
2 21             title: title,
3 22             url: url,
4 23             entry: entry,
5 24             listTime: listTime
6 25         });
1  arcList.push({
2 21             title: title,
3 22             url: url,
4 23             entry: entry,
5 24             listTime: listTime
6 25         });

  //if(param==null || param == ‘undefined’){
  //res.send(‘why no params,go put one;’);
  //}
  //res.send(‘Hello ‘+param);

那样就处理完了,结果早就在上头突显了,假设博客样式跟自个儿的博客样式一样,应该都能抓取了,

那般就处理完了,结果已经在上面突显了,就算博客样式跟自家的博客样式一样,应该都能抓取了,

  res.send('Hello World');
});

// 定义好我们 app 的行为之后,让它监听本地的 3000 端口。这里的第二个函数是个回调函数,会在 listen 动作成功后执行,我们这里执行了一个命令行输出操作,告诉我们监听动作已完成。
app.listen(3000, function () {
  console.log('app is listening at port 3000');
});

接着完善分页抓取,那样就能把全副博客爬下来了

继之完善分页抓取,那样就能把方方面面博客爬下来了

图片 8图片 9

 1 var http = require('http');
 2 var cheerio = require('cheerio');
 3 
 4 var url = 'http://www.cnblogs.com/ghostwu/';
 5 
 6 function filterHtml(html) {
 7     var $ = cheerio.load(html);
 8     var arcList = [];
 9     var aPost = $("#content").find(".post-list-item");
10     aPost.each(function () {
11         var ele = $(this);
12         var title = ele.find("h2 a").text();
13         var url = ele.find("h2 a").attr("href");
14         ele.find(".c_b_p_desc a").remove();
15         var entry = ele.find(".c_b_p_desc").text();
16         ele.find("small a").remove();
17         var listTime = ele.find("small").text();
18         var re = /\d{4}-\d{2}-\d{2}\s*\d{2}[:]\d{2}/;
19         listTime = listTime.match(re)[0];
20         arcList.push({
21             title: title,
22             url: url,
23             entry: entry,
24             listTime: listTime
25         });
26     });
27     return arcList;
28 }
29 
30 function nextPage( html ){
31     var $ = cheerio.load(html);
32     var nextUrl = $("#pager a:last-child").attr('href');
33     if ( !nextUrl ) return ;
34     var curPage = $("#pager .current").text();
35     if( !curPage ) curPage = 1;
36     var nextPage = nextUrl.substring( nextUrl.indexOf( '=' ) + 1 );
37     if ( curPage < nextPage ) crawler( nextUrl );
38 }
39 
40 function crawler(url) {
41     http.get(url, function (res) {
42         var html = '';
43         var arcList = [];
44         res.on('data', function (chunk) {
45             html += chunk;
46         });
47         res.on('end', function () {
48             arcList = filterHtml(html);
49             console.log( arcList );
50             nextPage( html );
51         });
52     });
53 }
54 crawler( url );
 1 var http = require('http');
 2 var cheerio = require('cheerio');
 3 
 4 var url = 'http://www.cnblogs.com/ghostwu/';
 5 
 6 function filterHtml(html) {
 7     var $ = cheerio.load(html);
 8     var arcList = [];
 9     var aPost = $("#content").find(".post-list-item");
10     aPost.each(function () {
11         var ele = $(this);
12         var title = ele.find("h2 a").text();
13         var url = ele.find("h2 a").attr("href");
14         ele.find(".c_b_p_desc a").remove();
15         var entry = ele.find(".c_b_p_desc").text();
16         ele.find("small a").remove();
17         var listTime = ele.find("small").text();
18         var re = /\d{4}-\d{2}-\d{2}\s*\d{2}[:]\d{2}/;
19         listTime = listTime.match(re)[0];
20         arcList.push({
21             title: title,
22             url: url,
23             entry: entry,
24             listTime: listTime
25         });
26     });
27     return arcList;
28 }
29 
30 function nextPage( html ){
31     var $ = cheerio.load(html);
32     var nextUrl = $("#pager a:last-child").attr('href');
33     if ( !nextUrl ) return ;
34     var curPage = $("#pager .current").text();
35     if( !curPage ) curPage = 1;
36     var nextPage = nextUrl.substring( nextUrl.indexOf( '=' ) + 1 );
37     if ( curPage < nextPage ) crawler( nextUrl );
38 }
39 
40 function crawler(url) {
41     http.get(url, function (res) {
42         var html = '';
43         var arcList = [];
44         res.on('data', function (chunk) {
45             html += chunk;
46         });
47         res.on('end', function () {
48             arcList = filterHtml(html);
49             console.log( arcList );
50             nextPage( html );
51         });
52     });
53 }
54 crawler( url );
// 引入依赖
var express = require('express');
var superagent = require('superagent');
var cheerio = require('cheerio');
// 建立 express 实例
var app = express();

app.get('/', function (req, res) {

  // 用 superagent 去抓取 http://www.cnblogs.com/的内容
  superagent.get('http://www.cnblogs.com/')
    .end(function (err, sres) {
      // 常规的错误处理
      if (err) {
        return next(err);
      }
      // sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后
      // 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`
      // 剩下就都是 jquery 的内容了
      var $ = cheerio.load(sres.text);
      var items = [];
      $('.titlelnk').each(function (idx, element) {
        var $element = $(element);
        items.push({
          title: $element.text(),
          href: $element.attr('href')
        });
      });
      $('.lightblue').each(function (idx, element) {
        var $element = $(element);
        items[idx].author = $element.text();
      });

      res.send(items);
    });

});

app.listen(3000, function (req, res) {
  console.log('app is running at port 3000');
});

 

 

爬cnblogs.com的小说标题

 

选拔node app.js 命令执行成功了:  

     图片 10

③ 、尝试网络爬虫,据悉很*:这一次要写到详细一些:

     壹 、新建文件夹并开拓: mkdir nodesprider && cd nodesprider

     ② 、实例化项目确立package.json: npm init 生成package.json;

     ③ 、安装八个依靠并配置新闻到package.json中: npm install express
superagent cheerio –save  默许从官网下载信赖;

           express ( http://expressjs.com/)是 Node.js 应用最广泛的 web
框架,未来是 4.x 版本,它可怜薄。

    superagent(http://visionmedia.github.io/superagent/ ) 是个 http
方面的库,能够倡导 get 或 post 请求。

    cheerio(https://github.com/cheeriojs/cheerio )
大家能够领略成二个 Node.js 版的 jquery,用来从网页中以 css selector
取数据,使用办法跟 jquery 一样一样的。

     ④ 、爬虫逻辑代码:

// 引入依赖
var express = require(‘express’);
var superagent = require(‘superagent’);
var cheerio = require(‘cheerio’);
// 建立 express 实例
var app = express();

app.get(‘/’, function (req, res) {

// 用 superagent 去抓取 https://cnodejs.org/ 的内容
superagent.get(‘https://cnodejs.org/‘)
.end(function (err, sres) {
// 常规的错误处理
if (err) {
return next(err);
}
// sres.text 里面储存着网页的 html 内容,将它传给 cheerio.load 之后
// 就能够赢得1个兑现了 jquery 接口的变量,大家习惯性地将它取名为
`$`
// 剩下就都是 jquery 的剧情了
var $ = cheerio.load(sres.text);
var items = [];
$(‘#topic_list .topic_title’).each(function (idx, element) {
var $element = $(element);
items.push({
title: $element.attr(‘title’),
href: $element.attr(‘href’)
});
});

res.send(items);
});

});

app.listen(3000, function (req, res) {
console.log(‘app is running at port 3000’);
});

     5、执行app.js : node app.js ;访问:http://localhost:3000/;
浏览器输出音讯!成功了

 

相关文章