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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值