nodeJS(準(zhǔn)確的說是express+request+cheerio)做一個(gè)簡單的爬蟲购岗,爬取豆瓣電影的電影圖片赡鲜,電影描述袖订。
默認(rèn)認(rèn)為已安裝node環(huán)境柱蟀。
??創(chuàng)建文件夾projectName
在文件夾下命令行執(zhí)行npm init
钩蚊,一路回車贡翘,或者自定義信息初始化項(xiàng)目;成功后執(zhí)行npm install express request cheerio -S
安裝依賴砰逻;成功后在目錄下創(chuàng)建index.js
鸣驱,創(chuàng)建文件夾data
(用來存放爬取下來的電影描述)和image
(用來存放電影圖片);接下來就開始寫爬取邏輯了蝠咆,代碼如下:
var http = require('https'); //使用https模塊
var fs = require('fs');//文件讀寫
var cheerio = require('cheerio');//jquery寫法獲取所得頁面dom元素
var request = require('request');//發(fā)送request請求
var i = 0;
var url = "https://movie.douban.com/subject/1889243/?from=subject-page";
//初始url
function fetchPage(x) { //封裝一層函數(shù),方便遞歸調(diào)用
startRequest(x);
}
function startRequest(x) {
//采用http模塊向服務(wù)器發(fā)起一次get請求
http.get(x, function(res) { //get到x網(wǎng)址踊东,成功執(zhí)行回調(diào)函數(shù)
var html = ''; //用來存儲請求網(wǎng)頁的整個(gè)html內(nèi)容
res.setEncoding('utf-8'); //防止中文亂碼
//監(jiān)聽data事件,每次取一塊數(shù)據(jù)
res.on('data', function(chunk) {
html += chunk;
});
//監(jiān)聽end事件刚操,如果整個(gè)網(wǎng)頁內(nèi)容的html都獲取完畢闸翅,就執(zhí)行回調(diào)函數(shù)
res.on('end', function() {
var $ = cheerio.load(html); //采用cheerio模塊解析html
var news_item = {
//獲取電影的標(biāo)題
title: $('.related-info h2 i').text().trim(),
//i是用來判斷獲取頁數(shù)
i: i = i + 1,
};
console.log(news_item); //打印新聞信息
var news_title = $('.related-info h2 i').text().trim();
savedContent($, news_title); //存儲每篇文章的內(nèi)容及文章標(biāo)題
savedImg($, news_title); //存儲每篇文章的圖片及圖片標(biāo)題
//下一篇電影的url
nextLink = $(".recommendations-bd dl:last-child dd a").attr('href');
if(i <= 10) { //爬取10頁
fetchPage(nextLink);
}
});
}).on('error', function(err) { //http模塊的on data,on end ,on error事件
console.log(err);
});
}
//存儲標(biāo)題函數(shù)
function savedContent($, news_title) {
$('#link-report span').each(function(index, item) {
var x = $(this).text();
x = x + '\n';
//將新聞文本內(nèi)容一段一段添加到/data文件夾下,并用新聞的標(biāo)題來命名文件
fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function(err) {
if(err) {
console.log(err);
}
});
})
}
//該函數(shù)的作用:在本地存儲所爬取到的圖片資源
function savedImg($, news_title) {
$('#mainpic img').each(function(index, item) {
var img_title = $('#content h1 span').text().trim(); //獲取圖片的標(biāo)題
if(img_title.length > 35 || img_title == "") { //圖片標(biāo)題太長
img_title = "Null";
}
var img_filename = img_title + '.jpg';
var img_src = $(this).attr('src'); //獲取圖片的url
//采用request模塊菊霜,向服務(wù)器發(fā)起一次請求坚冀,獲取圖片資源
request.head(img_src, function(err, res, body) {
if(err) {
console.log(err);
}
});
request(img_src).pipe(fs.createWriteStream('./image/' + news_title + '---' + img_filename));
//通過流的方式,把圖片寫到本地/image目錄下鉴逞,并用標(biāo)題和圖片的標(biāo)題作為圖片的名稱记某。
})
}
fetchPage(url); //主程序開始運(yùn)行
項(xiàng)目根目錄下DOC命令node index.js
執(zhí)行程序,完成后可在data
和image
下查看爬取下來的內(nèi)容啦构捡。
這個(gè)只是簡單的爬取電影信息的程序液南,需要其他功能,需要在邏輯中進(jìn)行改動(dòng)勾徽。(代碼是我抄的滑凉,如作者不同意,請聯(lián)系我喘帚,我修改3╂ⅰ)