宝哥软件园

基于nodejs的多页面爬虫实例代码

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

前言

前端时间再回顾了一下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/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+