30行实现一个简易可扩展node爬虫

Posted by eric on 2017-03-31

转载需注明:前端唐小胖

很久没有更新自己的博客了,稍微写一点自己最近的收获。这篇文章会写的很详细,希望你阅读完以后可以自己动手做一个属于自己的爬虫。
毕竟,他只要三十行对吧😄

预备介绍

我对于爬虫的理解是一种模拟人的行为去访问网站,然后将浏览的内容进行收集的工具。
他的好处在于替代人去访问大量的信息,并根据人制定的规则返回需要的内容。大大提高了我们的工作生活效率。

环境搭建及模块介绍

其实文章的标题的确只是一波套路,要做一个健壮的爬虫需要考虑的东西很多,代码更是远远超过三十行。
你需要考虑到你的爬虫所处的场景,如果你的爬虫是全站级别的爬虫,就需要考虑到网站本身对于爬虫的友好性,以及网站的DOM结构对于爬虫的影响。对于爬取内容的除杂和数据包装等。
不过任何的大型项目都是从一个小的idea启发而生,所以笔者还是要实现自己的诺言,用三十行完成一个简单的爬虫。

需要的node模块

  • http
  • cheerio

是的,仅仅npm安装这两个模块即可。
稍微介绍一下这两个有名的模块,不懂的同学可以顺便学一下以后其他的项目也可能会需要它们

  • http模块
    nodejs中的http模块中封装了一个HTPP服务器和一个简易的HTTP客户端,
    http.Server是一个基于事件的http服务器,http.request则是一个http客户端工具,用于向http服务器发起请求。
    这次我们就将使用http.request向目标网站发起请求。
  • cheerio模块
    cheerio是nodejs的抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现。适合各种Web爬虫程序。

实现

我将用我同事的博客作为我们的爬取目标,同事的博客地址。是一个萌妹子哦,大家可以顺路关注一波她的博客。
看代码吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const http = require("http");
const cheerio = require("cheerio");
const baseUrl = "http://coolmogu.com/";
let articleUrls = [];

// 访问博客地址
http.get("http://coolmogu.com/", function(res) {
let html = "";
res.on("data" ,function(data) {
console.log("开始获取作者主页信息...");
html += data;
// 接受对方服务器返回数据
});

res.on("end",function() {
// 连接结束返回
console.log("获取作者主页信息成功~");
console.log("==========");
getArticleUrls(html);
console.log(articleUrls);
});
}).on("error",function(){
console.log("获取作者主页信息出错!");
});
function getArticleUrls (html) {
let $ = cheerio.load(html);
使用cheerio筛选需要的数据
let titles = $(".post-title a");
// console.log(titles);
titles.map(function(index){
将结果储存到数组中
articleUrls.push($(this).attr("href"));
})
};

至此我们就完成了一个三十行的node爬虫,我们成功的得到了萌妹子博客首页的每个文章的详细列表,后续可以利用这个地址对博客的每一个文章进行详细的爬取,
从而一个可扩展的node爬虫就完成了,其实根本不需要30行,但是需要意识到这只是一个爬虫的开始,有很多需要完善的地方,后续会对博客的详情页爬取进行介绍,
包含

  • 详情页内容爬取
  • 输出爬取内容
  • 翻页逻辑处理
  • 文章内容除杂

请保持关注😄
转载需注明:前端唐小胖