爬虫其实就是模仿浏览器访问页面,然后把页面保存起来备用。
爬虫的方法,直接上代码:
function getUrl(url,success,error){ let urlObj = urlParser.parse(url); let mod = null; //判断用是哪个协议,对应用哪个模块 if(urlObj.protocol=='http:'){ mod = require('http'); }else{ mod = require('https'); } let req = mod.request({ hostname: urlObj.hostname, path: urlObj.path },res=>{ //如果是200表示成功,则把buffer用数组存起来,end的时候发给success回调 if(res.statusCode==200){ let arr=[]; res.on('data',buffer=>{ arr.push(buffer); }) res.on('end',_=>{ let b = Buffer.concat(arr); success && success(b); }) } // 如果是重定向,拿到重定向地址res.headers.location,递归自己 else if(res.statusCode==301||res.statusCode==302){ getUrl(res.headers['location'],success,error) } //其他则是出错了 else{ error && error(res.statusCode); } }) req.end(); req.on('error',err=>{ error && error(err); }) }
上面的方法普通页面够用了,但是有些页面有些奇怪,例如天猫,编码是gbk,所以我们需要用把buffer进行gbk解码:
const gbk = require('gbk'); //把gbk Buffer解码并编码成utf8字符串 gbk.toString('utf-8',buffers)
获得html字符串后,我们通常的做法就是写正则来匹配,这样无疑是极其麻烦的,我们有一个node组件叫jsdom就让我们在node里面实现了获取dom的操作:
const jsdom = require('jsdom').JSDOM; let document = (new jsdom(htmlStr)).window.document; //之后可以用queryselector、getElementById。。。。。