今天来用Node.js做一个小小的爬虫项目
爬虫目标:(科学松鼠会)
我们需要创建一个文件夹,自己命名就好,然后在文件夹里创建两个文件夹分别命名为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的内容。
控制台的输出
获取的图片
获取的文章