有了node後,前端抓取網頁數據就不成問題了
一般抓取都是獲取頁面中指定的數據。
分兩種,一種同標籤的html 一種是標籤的屬性值。
我自己寫的比較lou ,只是從列表獲取詳情url,然後讀取詳情頁面。
用cheerio獲取有用數據,用fs寫到文件內。保存指定的圖片。
當然它對於頁面用ajax加載的數據是無效的。
request 只能拿到頁面的源碼。至於獲取ajax後的頁面代碼就需要用phantomjs 了。
現在用的對於大多已經夠用了,速度比phantomjs快多了。
需要注意的幾點:
1、創建目錄
if(!fs.existsSync('pages')){
fs.mkdirSync('pages')
}
這是判斷然後創建文件夾
但對於'/a/b/c'這種的就需要遞歸了。
用mkdir創建是會報錯的,淌有a b 文件夾c是創建失敗的。
//創建文件夾目錄
//mkdir('a/b/c/d')
function mkdir(s){
if(!fs.existsSync(s)){
var a='';
s.split('/').forEach(function(v){
//console.log(v);
create(v);
})
function create(p){
a+=p;
if(!fs.existsSync(a)){
fs.mkdirSync(a);
}
a+='/'
}
}
}
2、cheerio用法
var $=cheerio.load(body)
之後用$來查找標籤
$('#gallProd img');
as.eq(i).attr('src').replace('prodTmb','prodPage');
$('.infoProdDet .originalPrice').text()
3、寫入文件
fs.appendFile('/pages/info.html',txt,fn)
4、下載圖片
下載圖片用http,對於https開頭的需要寫成http
圖片保存用fs.writeFile('pages/img/1.jpg',data,'binary',fn)
ar fs=require('fs');
var request=require('request')
var cheerio=require('cheerio');
var path=require('path');
var http=require('http')
if(!fs.existsSync('pages')){
fs.mkdirSync('pages')
}
var site='https://www.xxxx.com'
function getlist(name,url){
request(url,function(error,res,body){
if (!error && res.statusCode == 200) {
//console.log(body); //返回請求頁面的HTML
gethtml(name,body);
}
})
}
function gethtml(name,data){
console.log('-----------------------------------------------\n')
var $=cheerio.load(data);
var urls=[]
var a=$('.prodList a[itemprop="url"]');
for(var i=0;i<a.length;i++){
var s=a.eq(i).attr('href')
console.log(s)
getshow(name,s)
}
}
function getshow(filename,url){
if(!fs.existsSync('pages/'+filename)){
fs.mkdirSync('pages/'+filename);
}
request(site+url,function(error,res,body){
if (!error && res.statusCode == 200) {
ditalshow(site+url,filename,body);
}
})
}
function ditalshow(url,filename,body){
var $=cheerio.load(body)
var as=$('#gallProd img');
var txt=url+'\n';
//圖片地址
for(var i=0;i<as.length;i++){
var a=as.eq(i).attr('src').replace('prodTmb','prodPage');
a='http:'+a;
//下載圖片
//downimg(filename,a);
//console.log(a);
txt+=a+'\n';
}
var c=$('.infoProdDet .originalPrice').text() +' '+ $('.infoProdDet .salePrice').text()
txt+=c+'\n';
var size=$('li.sizeBox label')
for(var i=0;i<size.length;i++){
var t=size.eq(i).attr('for').split('_')[2].slice(1);
txt+=t+' ';
}
txt+='\n';
txt+=$('.infoBox').html()+'\n\n';
appendFile(filename+'/info.html',txt);
}
var url='http/list'
getlist('Jeans',url)
function appendFile(file,txt){
fs.appendFile('pages/'+file,txt,function(err){
if(err){
console.log(file,txt,err);
}
})
}
//downimg('Jeans','img url')
function downimg(file,url){
var name=url.slice(url.lastIndexOf('/')+1);
http.get(url, function(res) {
var data = '';
res.setEncoding('binary');
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
fs.writeFile('pages/'+file+'/'+name, data, 'binary', function(err) {
if (err) {
return console.log(err);
}
});
});
}).on('error', function(err) {
console.log(err);
});
}