request cheerio 抓取頁面並獲取所需數據

有了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);
    });	
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章