我對爬蟲有一點點執(zhí)念絮识,想著非要自己上手寫一個試試。在看到 http的get方法的時候 感覺像是看到了希望嗽上。于是就只使用get方法次舌,加一個 fs的保存文件的方法,來實現(xiàn)一個簡單的爬蟲兽愤。
http get方法簡介
首先讓我們來看一下 get
方法的書寫格式:
const http = require('http');
http.get(url, function(res){
// data method
res.on('data', function(data){
console.log(data);
console.log('傳輸數(shù)據(jù)中....')
});
// end method
res.on('end', function(){
console.log('數(shù)據(jù)傳輸完畢');
})
}).on('error', function(err){
console.log('報錯了')
})
此方法首先接收一個 url的地址作為訪問參數(shù)彼念, 第二個參數(shù)則為一個回調(diào)函數(shù)。 此回調(diào)函數(shù) 接收一個 對象 浅萧,這個對象中會有兩個方法 逐沙,分別是 data
和end
。 我們可以通過 on
的形式 對 這兩個方法進行 監(jiān)聽洼畅。當 被請求的網(wǎng)頁數(shù)據(jù)量很大時吩案,此data會被 觸發(fā)幾次, 每次都會返回一個數(shù)據(jù)片段土思。 數(shù)據(jù)片段之和就是整個網(wǎng)頁了务热。
但是在這里需要注意的是, data默認返回的 是Buffer類己儒。如果要轉(zhuǎn)成 字符串的話崎岂, 需要調(diào)用 buffer.toString('utf8')方法。 當然這里的參數(shù)亦可以是 進制數(shù)闪湾。我們也可以在 data監(jiān)聽函數(shù)上進行 設(shè)置
res.on('data', 'utf8', function(res){
console.log(res); // string
})
在請求地址的過程中冲甘,如果出現(xiàn)錯誤的話, 就會返回一個錯誤給error
方法途样。 所以有必要時江醇,可以在error
回調(diào)中寫一些 失敗的邏輯。
保存一張網(wǎng)圖
const http = require('http');
const fs = require('fs');
let img = 'http://dpic.tiankong.com/r3/w8/QJ6871380245.jpg';
http.get(img, function(res){
let arr = [];
res.on('data', function(data){
arr.push(data);
})
res.on('end', function(){
buf = Buffer.concat(arr);
fs.writeFileSync('./4.jpg', buf);
console.log('end....')
})
})
爬取整個網(wǎng)頁的圖片
其實 想要獲取整個頁面的圖片很簡單
- 通過get請求獲取整個網(wǎng)頁的buffer數(shù)據(jù)何暇,并轉(zhuǎn)成字符串拼接
- 利用
cheerio
模塊中的 語法實現(xiàn) 對 html字符串進行jq操作 - jq操作 提取出所有img標簽上的 src地址
- 再調(diào)用一次get方法請求每個圖片地址陶夜,獲取圖片的buffer數(shù)據(jù)
- 將buffer數(shù)據(jù)存到arr中, 并 通過
Buffer.concat(arr)
的方法將 arr轉(zhuǎn)成一個Buffer對象 - 通過
fs.writeFileSync
保存 buffer對象為一張圖片即可
以下展示代碼
let https = require('https');
let http = require('http');
let cheerio = require('cheerio'); // html字符串版的 jq
let fs = require('fs');
let url = 'https://www.quanjing.com/creative/topic/1';
https.get(url , function(res){
var str = '';
res.on('data', function(data){
str+= data.toString('utf8');
})
res.on('end', function(){
let $ = cheerio.load(str);
addImg($);
console.log('傳輸完畢');
})
}).on('error', function(err){
console.log(err);
})
function addImg($){
$('img').each(function(index, ele){
let src = $(ele).attr('src');
if(index > 3){
saveImg(src, index);
}
})
}
function saveImg(url,index){
http.get(url,function(res){
let arr = [];
res.on('data', function(data){
arr.push(data);
})
res.on('end', function(){
let buf = Buffer.concat(arr);
fs.writeFileSync('./img/'+(index+1)+'.jpg', buf);
console.log('圖片保存成功')
})
})
}