前言
最近在學習Nodejs,想做個小項目練練手,查了一下資料,發現用nodejs做爬蟲好像不錯,于是參考了這個例子NodeJs妹子圖爬蟲,也做了個爬蟲項目。
參考資料:
1.Node.js 教程
2.Request模塊
3.cheerio模塊
4.async模塊
5.mkdirp模塊
6.path模塊
簡介
目標網站:新世界大門
主要功能:爬取設定的頁面,下載妹子圖,每頁的圖分別放進一個文件夾,效果如下:
文件夾
運行圖
重點
1.獲得所在頁面的圖片地址,用瀏覽器按F12查看所在頁面的代碼:
圖片地址
用cheerio模塊選擇到圖片地址。
2.獲得所在頁面的全部地址,查看代碼可知,只有一張圖片,通過按下全部圖片才可以加載完全部圖片,通過圖片地址可得規律,按數字1開始排序,所以只要得到最后的數字即可,通過頁面可得:
總頁數
3.用了async模塊控制并發量,如果不控制并發去請求,并發請求量過大,受到帶寬限制,容易丟圖。所以用了async來控制并發,減少丟圖情況,帶寬大朋友的可以加大點并發試試。我說說我用的情況吧,最多請求數50個鏈接(不敢請求太多,怕搞垮別人服務器),每個鏈接大約35張左右圖片,大概50*35=1750張圖片下載,50秒左右下完,跟帶寬也有關系。
代碼
//author='niansen'
var request = require('request');
var cheerio = require('cheerio');
var path = require('path');
var fs = require('fs');
var async = require('async');
var mkdirp = require('mkdirp');
// 需要爬的網址
function getUrls() {
var urls = []
, baseUrl = 'http://www.mmjpg.com/mm/';
for (var i = 484; i < 485; i++) {
var tmp = baseUrl + i;
urls.push(tmp);
var dir='./mei/'+i;
//創建目錄
mkdirp(dir, function(err) {
if(err){
console.log(err);
}
else console.log(dir+'文件夾創建成功!');
});
}
return urls;
}
var urls = getUrls();
async.eachSeries(urls, function (url, callback) {
fetchUrl(url, callback);
}, function (err, result) {
console.log('大門已經全部打開,安靜等待下載吧。');
});
// 抓取網頁內容
function fetchUrl(url,callback) {
var options = {
url: url,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36',
'Connection':'keep-alive'
}
};
console.log('打開新世界大門:'+options.url);
request(options, function (error, response, body) {
if(error) console.log(error);
else console.log('成功打開新世界大門'+options.url);
if (!error && response.statusCode == 200) {
acquireData(options.url,body);
callback(null, null);
}
})
}
function acquireData(url,data) {
var $ = cheerio.load(data);
var meizi = $('#content img').toArray();
var mm= $('#page a').eq(6).text();
console.log('獲得:'+mm+'張妹子圖');
var list=url.split('/');
for (var i=1; i<mm;i++){
var imgsrc =path.dirname(meizi[0].attribs.src)+'/'+i+'.jpg';
console.log(imgsrc);
var filename = parseUrlForFileName(imgsrc); //生成文件名
downloadImg(imgsrc,filename,'./mei/'+list[4],function() {
console.log(filename + ' done');
});
}
}
function parseUrlForFileName(address) {
var filename = path.basename(address);
return filename;
}
var downloadImg = function(uri, filename, dir, callback){
request({uri: uri, encoding: 'binary'}, function (error, response, body) {
if (!error && response.statusCode == 200) {
if(!body) console.log("(╥╯^╰╥)哎呀沒有內容。。。")
fs.writeFile(dir+'/'+filename, body, 'binary', function (err) {
if (err) {console.log(err);}
console.log('o(* ̄▽ ̄*)o偷偷下載'+dir+'/'+filename + ' done');
});
}
});
};
最后
本文章只是用于技術交流,請勿用于商業用途,請勿長時間大并發請求,也不要惡意攻擊。如文章涉及侵權或其他不良影響,請告知我。最后說一句,運行成功的朋友請注意身體。