线上环境小包总html
爬虫模块:用于爬取一些我看的上的文章,主要采用request,cheerio模块对数据的爬取和处理,vue
同时须要注意处理爬取图片的处理
segmentfault的文章不用登陆就能查看,全部可用访问url就能取到文章的内容,惟一须要的注意的是请求的图片连接要作特殊的处理,最开始原本我是用的盗链的形式,后面过了一段时间segmentfault不容许盗链了,没办法只能从本身网站加载了。node
在segmentfault中图片的src中带有?,&符号这中特殊的符号(应该是图片服务器的缘由),而且也没有图片的后缀 <img data-src="/img/bVTrwb?w=598&h=122" src="/img/bVTrwb?w=598&h=122" style="cursor: pointer; display: inline;"> 、因此我在爬取图片的时候就须要处理特殊符号,和加后缀 let imgError = false, imgPath = (imgSavePath + src).replace(/\?|\&/g, '_'); //替换特殊符号 let writeFile = fs.createWriteStream(imgPath), extname; request(_src || (addr + src), {timeout: 60000}).on('response', function(response){ if(response.statusCode.toString().indexOf('4') == 0){ self.remove(); imgError = true; resolve2(); return; } extname = path.extname(response.request.path); //在响应头中获取文件后缀 if(!extname && response.headers['content-type'].indexOf('image') != -1){ extname = '.' + response.headers['content-type'].split('/')[1]; if(extname.indexOf('svg') != -1){ extname = '.svg'; } } let imgSrc = _src ? src : src + extname; self.attr('src', imgSrc); }).on('error', function(err){ writeLog('请求图片失败: '+ (_src||src)+ ' 来至url: '+ url, true); self.remove(); imgError = true; reject2(); }).pipe(writeFile); writeFile.on('finish', function(){ if(imgError){ return ; } if(extname){ let imgPath = (imgSavePath + src).replace(/\?|\&/g, '_'); //添加后缀 if(fs.existsSync(imgPath)){ try{ if(src.indexOf('.') != -1){ resolve2('自带后缀: '+ src); return; } fs.renameSync(imgPath, imgPath + extname); writeLog('修改图片: ' + imgPath + extname); }catch(e){ writeLog('修图图片失败缘由: .'+ src + extname + '\n' + e, true); } resolve2(imgPath + extname); }else { writeLog('图片不存在: .'+ src+ ' 来至url: '+ url, true); reject2(url); } } });
文章中的代码样式,须要本身用highlight模块去添加。
而后就是把文章的关键信息,如文件的url,时间,做者,保存到数据库,把文章的真正的html保存为一个文件,而后根据url去加载本地的html。webpack
13324022五、 193572405