这里的断点续传不是文件下载时的断点续传,而是指在爬行页面时有时会遇到各种网络中断而从中断前的页面及其数据继续爬行的过程,这个过程和断点续传原理上相似故以此命名。我的具体做法是:在下载出现故障或是图片已经全部获得时,将存储目录,当前爬行页面和已经获取的图片地址以json形式存储到数据文件中,而用户选择断点续传模式时提取数据文件中的这三条信息,继而从上次中断之处重新运行。
数据文件示例:
{"url":"http://m.03122.com/gaoqing/9353/27.html","pictures":["http://img.cdjqjy.com/pic/gqimg/94/b36ab1a61b3c19d84386ed69ffcdad16.jpg","http://img.cdjqjy.com/pic/gqimg/94/fd4b2a40df592105725d7374f101d86c.jpg","http://img.cdjqjy.com/pic/gqimg/94/cd742a03afa54603d39b2a0d67190cfb.jpg","http://img.cdjqjy.com/pic/gqimg/94/69493144d80120ce1631d98b77ab667a.jpg"],"folder":"pictures(2017-11-18 15_5_31)"}
Node.js 代码如下:
//====================================================== // mm131图片批量下载爬虫1.01 // 1.00 具备功能 // 1.01 增加断点续传 // 2017年11月15日 //====================================================== // 内置http模块 var http=require("http"); // 内置文件处理模块,用于创建目录和图片文件 var fs=require('fs'); // 用于转码。非Utf8的网页如gb2132会有乱码问题,需要iconv将其转码 var iconv = require('iconv-lite'); // cheerio模块,提供了类似jQuery的功能,用于从HTML code中查找图片地址和下一页 var cheerio = require("cheerio"); // 请求参数JSON。http和https都有使用 var options; // request请求 var req; // 图片数组,找到的图片地址会放到这里 var pictures=[]; // 存放图片的目录 var folder=""; //-------------------------------------- // 爬取网页,找图片地址,再爬 // pageUrl sample:http://www.mm131.com/xinggan/2852.html // pageUrl sample:http://www.mm131.com/xinggan/2853.html // pageUrl sample:http://www.mm131.com/xinggan/2976.html //-------------------------------------- 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={ hostn