今天来用Node.js做一个小小的爬虫项目
爬虫目标:http://songshuhui.net/(科学松鼠会)
我们需要创建一个文件夹,自己命名就好,然后在文件夹里创建两个文件夹分别命名为data和img,进入到这个总文件夹的目录终端下。
终端输入npm init,创建package.json配置文件,根据自己的实际情况填写,或者一路回车。
再次输入npm install cheerio request --save,会下载好cheerio(用法几乎和Jquery一样),request依赖包。
在总文件夹里再创建index.js,用来编写我们的主体逻辑代码。
下面就是代码
var http = require('http');
var fs = require('fs');
var cheerio = require('cheerio');
var request = require('request');
var i = 0;
var url = "http://songshuhui.net/archives/96881";//初始化的地址
function fetchPage(x){
startFetch(x);
}//封装函数
function startFetch(x){
//采用http模块向服务器发起一次get请求
http.get(x,function(res){
var html = ""; //用来储存整个页面的html内容
res.setEncoding("utf-8");//防止中文乱码
res.on('data',function(chunk){
html += chunk;
});//监听data事件,每次取一块数据
res.on('end',function(){
var $ = cheerio.load(html);//用cheerio模块解析html
var author = $(".metax_single a:first-child").text().trim();//获取文章的作者
var title = $(".atrctitle .contenttitle a").text().trim();//获取文章的标题
var link = $(".atrctitle .contenttitle a").attr("href");//获取文章的网页地址
var new_item = {
Title: title,
Author: author,
Link: link,
i: i =i + 1//用来判断获取了多少文章
};
console.log(new_item);
savedContent($,title);//储存文章的文字内容
savedImg($,title);//储存文章的图片内容
var nextLink = $(".navilinks .prevlink a").attr("href");
var str = encodeURI(nextLink);
if(i <= 500){
fetchPage(str);
}//通过控制i控制抓取的文章的数目
});//监听end事件,如果整个网页内容都获取完毕,执行回调函数
}).on('error',function (err) {
console.log(err);
});
}
function savedContent($,title){
$(".entry p").each(function(index,item) {
var x = $(this).text();
x = x + "\n";
fs.appendFile("./data/" + title + ".txt", x, "utf-8", function (err) {
if (err) {
console.log(err);
}
});
});
}
//本地储存爬取的文字资源
function savedImg($,title){
$(".entry .wp-caption img").each(function(index,item) {
var img_title = $(this).attr("alt");
var img_filename = img_title + ".jpg";
var img_src = $(this).attr("src");
request.head(img_src,function(err,res,body){
if(err){
console.log(err);
}
});
request(img_src).pipe(fs.createWriteStream("./img/" + title + "--" + img_filename));
//采取request模块向服务器发起一次请求,获取图片资源
});
}
//本地储存爬取的图片资源
fetchPage(url);
代码部分完成,在webstorm上运行index.js文件,直接选中index.js,点击右上角的绿色三角按钮。
选取的这个网址,分析网站源代码,每个文章都有上一页或者下一页的内容,这样我们可以串联式的获取dom节点的不同url,因此获得每个url的内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。