前言
前端时间再回顾了一下node.js,于是顺势做了一个爬虫来加深自己对结节的理解。
主要用的到是请求嘿,再见,异步三个模块
请求
用于请求地址和快速下载图片流https://github.com/request/request
再见
为服务器特别定制的,快速、灵活、实施的jQuery核心实现。
便于解析超文本标记语言代码https://www.npmjs.com/package/cheerio
异步非同步(异步)
异步调用,防止堵塞http://caolan.github.io/async/
核心思路
用请求发送一个请求。获取超文本标记语言代码,取得其中的img标签和a标签。通过获取的a表情进行递归调用。不断获取img地址和a地址,继续递归获取img地址通过请求(照片)。管道(fs。createwritestream(目录“/”文件名));进行快速下载函数请求全部(URL){请求({ uri : URL,标头RS :设置。header }),函数(错误,响应,正文){ if(错误){ console.log(错误);} else { console。日志(响应。status code);if(!错误响应。statuscode==200){ var $=cheerio。负载(车身);var photos=[];$('img ').每个(函数(){ //判断地址是否存在if ($(this).attr(' src '){ var src=$(this).attr(' src ');var end=src.substr(-4,4).toLowerCase();if (end==' .jpg' || end==' .png' || end==' .JPEG '){ if(isURl(src)){照片。推送(src);} } } });downloadImg(照片,目录,设置。download _ v);//递归爬虫$('a ').每个(函数(){ var murl=$(this)).attr(' href ');if(isURl(murl)){ setTimeout(function(){ fetchre(murl);},超时);超时=设置。Ajax _超时;} else { setTimeout(function(){ fetch re '(http://www。伊凡斯基。com/' murl));},超时);超时=设置。Ajax _超时;} }) } } });} 防坑
1.在请求通过图片地址下载时,绑定错误事件防止爬虫异常的中断。
2.通过异步非同步(异步)的mapLimit限制并发。
3.加入请求报头,防止互联网协议(互联网协议的缩写)被屏蔽。
4.获取一些图片和超链接地址,可能是相对路径(待考虑解决是否有通过方法)。
函数downloadImg(照片、目录、asyncNum) { console.log('即将异步并发下载图片,当前并发数为: ' async num);async.mapLimit(照片,asyncNum,函数(照片,回调){ var filename=(新日期()。getTime()) photo.substr(-4,4);如果(文件名){ console.log('正在下载照片);//默认//fs.createWriteStream(目录'/'文件名)//防止管错误请求(照片)。开启('错误',函数(错误){控制台。日志(err);}) .管道(fs。create write stream(dir '/filename));console.log('下载完成');回调(null,文件名);} },函数(错误,结果){ if(错误){ console。日志(err);} else { console.log('好的!');console.log(结果);} })} 测试:
可以感觉到速度还是比较快的。
完整地址。https://github.com/hua1995116/node-crawler/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。