request cheerio 抓取页面并获取所需数据

来源:互联网 发布:罗氏lc480软件安装 编辑:程序博客网 时间:2024/06/07 08:00

有了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
原创粉丝点击