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