一、建立工程目录
使用cmd命令:
建一个根目录文件夹:mkdir spider
建一个保存文章内容文件夹: mkdir data
建一个保存图片资源文件夹: mkdir image
以及spider.js文件
二、安装包
cd spider 进入根目录
npm init 初始化项目,若不需要特别配置,可一路回车
npm install cheerio --save
npm install request --save
说明:由于http模块、fs模块都是内置的包,因此不需要额外添加。
三、写代码
代码都是在根目录下spider.js中
var http = require('http');
var fs = require('fs');
var cheerio = require('cheerio');
var request = require('request');
var url = 'http://www.hsu.edu.cn/34/28/c24a78888/page.htm' // 文章的链接地址
// 获取文章信息
function getArticle(url) {
// 使用http模块向服务器发起一次get请求
http.get(url, function(res) {
var html = ''; // 保存请求的页面整个html内容
res.setEncoding('utf-8'); // 防止中文乱码
// 监听data事件,获取每块的数据
res.on('data', function(chunk) {
html += chunk;
})
// 监听end事件,当请求的网页内容全部获取完毕,执行回调函数
res.on('end', function(err) {
var $ = cheerio.load(html); // 采用cheerio模块解析html
var news_item = {
title: $('.arti_title').text(),
arti_publisher: $('.arti_publisher').text().split(':')[1],
author: $('.arti_views').text().split(':')[2],
time: $('.arti_update').text().split(':')[1]
}
news_item.title = news_item.title.substring(0, 8); //截取标题部分内容作为文件名
// 保存每篇文章的内容
saveContent($, news_item.title);
// 保存文章图片
saveImg($, news_item.title);
})
})
}
// 保存文章内容
function saveContent($, title) {
$('.wp_articlecontent p').each(function(index, item) {
var text = $(item).text(); // 获取每段的内容
if (text.substring(0, 2).trim() == '') { // 通过判断获取的每段内容前面是否有空格来确定是文章内容还是图片标题
text = text + '\n'; // 每段文章需要换行
// 在同一文件中添加每段的内容
fs.appendFile('./data/' + title + '.txt', text, 'utf-8', function(err) {
if (err) {
console.log(err)
}
})
}
})
}
// 保存图片资源
function saveImg($, title) {
$('.wp_articlecontent img').each(function(index, item) {
var img_title = $(item).parents().next().text(); // 图片标题
var img_filename = img_title.substring(0, 8) + '.jpg'; // 图片文件名
var img_url = 'http://www.hsu.edu.cn' + $(item).attr('src'); // 图片请求路径
// 通过流的方式,写入文件
request.head(img_url, function(err, res, body){
if (err) {
console.log(err)
}
})
request(img_url).pipe(fs.createWriteStream('./image/' + img_filename));
})
}
getArticle(url);
使用node spider.js运行查看效果
附上代码图