Node.js abaike图片批量下载Node.js爬虫1.00版
这个与前作的差别在于地址的不规律性,需要找到下一页的地址再爬过去找。
//====================================================== // abaike图片批量下载Node.js爬虫1.00 // 2017年11月9日 //====================================================== // 内置http模块 var http=require("http"); // 内置文件处理模块,用于创建目录和图片文件 var fs=require('fs'); // cheerio模块,提供了类似jQuery的功能,用于从HTML code中查找图片地址和下一页 var cheerio = require("cheerio"); // 请求参数JSON。http和https都有使用 var options; // request请求 var req; // 图片数组,找到的图片地址会放到这里 var pictures=[]; //-------------------------------------- // 爬取网页,找图片地址,再爬 // pageUrl sample:http://www.avbaike.net/27812.html // pageUrl sample:http://www.avbaike.net/27812.html/2 //-------------------------------------- function crawl(pageUrl){ console.log("Current page="+pageUrl); // 得到hostname和path var currUrl=pageUrl.replace("http://",""); var pos=currUrl.indexOf("/"); var hostname=currUrl.slice(0,pos); var path=currUrl.slice(pos); //console.log("hostname="+hostname); //console.log("path="+path); // 初始化options options={ hostname:hostname, port:80, path:path,// 子路径 method:'GET', }; req=http.request(options,function(resp){ resp.setEncoding('utf8'); var body=""; resp.on('data',function(chunk){ body+=chunk; }); resp.on('end',function(){ //console.log("body="+body); var $ = cheerio.load(body); // 找图片放入数组 $("#post_content p a").each(function(index,element){ var picUrl=$(element).attr("href"); //console.log(picUrl); pictures.push(picUrl); }) var nextPageUrl=null; // 找下一页 $(".pagelist a").each(function(index,element){ var text=$(element).text(); if(text.indexOf('下一页')!=-1){ nextPageUrl=$(element).attr("href"); } }) if(nextPageUrl==null){ console.log(pageUrl+"已经是最后一页了."); download(pictures); }else{ //console.log("下一页是"+nextPageUrl); crawl(nextPageUrl); } }); }); // 超时处理 req.setTimeout(10000,function(){ req.abort(); }); // 出错处理 req.on('error',function(err){ if(err.code=="ECONNRESET"){ console.log('[crawl]socket端口连接超时。'); console.log(err); }else{ console.log('请求发生错误,err.code:'+err.code); } }); // 请求结束 req.end(); } //-------------------------------------- // 下载图片 //-------------------------------------- function download(pictures){ var folder='pictures'; // 创建目录 fs.mkdir('./'+folder,function(err){ if(err){ console.log("目录"+folder+"已经存在"); } }); console.log("总计有"+pictures.length+"张图片将被下载."); for(var i=0;i<pictures.length;i++){ var picUrl=pictures[i]; downloadPic(picUrl); } } //-------------------------------------- // 下载单张图片 // picUrl sample:http://www.avbaike.net/wp-content/uploads/2016/08/108.jpg //-------------------------------------- function downloadPic(picUrl){ console.log("图片:"+picUrl+"下载开始"); // 得到hostname和path var currUrl=picUrl.replace("http://",""); var pos=currUrl.indexOf("/"); var hostname=currUrl.slice(0,pos); var path=currUrl.slice(pos); //console.log("hostname="+hostname); //console.log("path="+path); var picName=currUrl.slice(currUrl.lastIndexOf("/")); // 初始化options options={ hostname:hostname, port:80, path:path,// 子路径 method:'GET', }; req=http.request(options,function(resp){ var imgData = ""; resp.setEncoding("binary"); resp.on('data',function(chunk){ imgData+=chunk; }); resp.on('end',function(){ // 创建文件 var fileName="./pictures"+picName; fs.writeFile(fileName, imgData, "binary", function(err){ if(err){ console.log("文件"+fileName+"下载失败."); console.log(err); }else{ console.log("文件"+fileName+"下载成功"); } }); }); }); // 超时处理 req.setTimeout(10000,function(){ req.abort(); }); // 出错处理 req.on('error',function(err){ if(err.code=="ECONNRESET"){ console.log('[downloadPic]socket端口连接超时。'); console.log(err); }else{ console.log('[downloadPic]请求发生错误,err.code:'+err.code); console.log(err); } }); // 请求结束 req.end(); } //-------------------------------------- // 程序入口 //-------------------------------------- function getInput(){ process.stdout.write("\033[35m 请输入第一页URL:\033[039m"); //紫色 process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on('data',function(text){ process.stdin.end();// 退出输入状态 crawl(text.trim());// trim()是必须的! }); } // 调用getInput函数,程序开始 getInput();
Node.js abaike图片批量下载Node.js爬虫1.00版的更多相关文章
- Node.js abaike图片批量下载Node.js爬虫1.01版
//====================================================== // abaike图片批量下载Node.js爬虫1.01 // 1.01 修正了输出目 ...
- Node.js abaike图片批量下载爬虫1.02
//====================================================== // abaike图片批量下载爬虫1.02 // 用最近的断点续传框架改写原有1.01 ...
- Node.js umei图片批量下载Node.js爬虫1.00
这个爬虫在abaike爬虫的基础上改改图片路径和下一页路径就出来了,代码如下: //====================================================== // ...
- Node.js aitaotu图片批量下载Node.js爬虫1.00版
即使是https网页,解析的方式也不是一致的,需要多试试. 代码: //====================================================== // aitaot ...
- Node.js mimimn图片批量下载爬虫 1.00
这个爬虫在Referer设置上和其它爬虫相比有特殊性.代码: //====================================================== // mimimn图片批 ...
- Node.js nvshens图片批量下载爬虫 1.00
//====================================================== // www.nvshens.com图片批量下载Node.js爬虫1.00 // 此程 ...
- Node.js meitulu图片批量下载爬虫1.06版
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
- Node.js meitulu图片批量下载爬虫 1.05版(Final最终版)
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
- Node.js meitulu图片批量下载爬虫1.04版
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
随机推荐
- maven的项目管理方面细节
1.1 Maven 1.依赖管理.jar包.工程之间的依赖. 2.项目构建.实现项目的一步构建. 3.工程聚合.工程继承.工程依赖. 1.2 Maven的工程类型: 1.war包工程 2. ...
- 电脑IP总是变的问题
如题,如何解决该问题? 右键---->个性化---->更改桌面图标---->添加网络图标 右键网络图标----->属性---->更改适配器设置---->右键属性,找 ...
- Python/CMD 文件备份
1.使用Python压缩文件并另存 import zipfile, os #备份文件ZIP格式: folder 目标文件夹 : Targetfolder:另存地址 def backuptozip(fo ...
- MYSQL是什么?
#转载请联系 数据库主要分为两大类,关系型数据库和非关系型数据库.MYSQL是关系型数据库. 一.什么是关系型数据库呢? 1.关系型数据库,本质上是使用一张二维表来表示关系,和Excel表类似. 2. ...
- poj 2826(好坑,线段相交问题)
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11576 Accepted: 176 ...
- PHP开发经常遇到的几个错误
错误1:foreach循环后留下悬挂指针 在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法: $arr = array(1,2,3,4); foreach($a ...
- scrapy 工作流程
Scrapy的整个数据处理流程由Scrapy引擎进行控制,其主要的运行方式为: 引擎打开一个域名,蜘蛛处理这个域名,然后获取第一个待爬取的URL. 引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求 ...
- IntelliJ IDEA 常用设置/快捷键
经常用到 IntelliJ IDEA 编写java,由于不时需要重装系统,所以Mark一下一些基本的设置选项,以便查询,这篇帖子会一直更新,只要有常用的新的设置或者快捷键 一.常用设置 显示代码行号 ...
- 基于JS的event-manage事件管理库(一步一步实现)
关于文章 最近在提升个人技能的同时,决定把自己为数不多的沉淀记录下来,让自己理解的更加深刻,同时也欢迎各位看官指出不足之处. 随着node.js的盛行,引领着Javascript上天下地无所不能啊,本 ...
- Java Retry implement
There are many cases in which you may wish to retry an operation a certain number of times. Examples ...