////爬虫 const request = require('request'); const iconv = require('iconv'); const cheerio = require('cheerio'); const fs = require('fs'); //定义一个变量存放需要爬的网址 var baseUrl = 'https://pic.netbian.com'; //存放页面的地址 数组加下标 var pageArr =[]; var pageIndex = 0 //存放详情页的数组加下标 var hrefArr = []; var hrefIndex = 0; //i为页数 如果是第一页就直接向pageArr数组里面添加的首页的地址baseUrl //否则就向pageArr数组里面添加`${baseUrl}/index_${i}.html`地址 for (var i = 1; i <= 3; i++) { if (i == 1) { pageArr.push(baseUrl) } else { pageArr.push(`${baseUrl}/index_${i}.html`) } } // 调用getHtml数组加下标作为第一个参数 // 获取网页中.slist li 用each函数来遍历 each(下标,值) // 如果不包含nextpage // 就向hrefArr数组里面追加baseUrl(长地址)加this里面找a元素包含的href //调用requestInfo() function requestPage() { getHtml(pageArr[pageIndex], ($) => { $(".slist li").each(function (index, ele) { if (!$(this).hasClass("nextpage")) { hrefArr.push( `${baseUrl}${$(this).find("a").attr("href")}` ) } }) requestInfo() console.log("hrefArr: ", hrefArr); }) } // 定义requestInfo() 方法调用getHtml 数组加下标作为参数 // function requestInfo() { getHtml(hrefArr[hrefIndex], ($) => { request(`${baseUrl}${$(".photo-pic img").attr("src")}`) .pipe( fs.createWriteStream(`./img/${ Math.random() * 1000000 + `${Date.now()}` }.jpg`) ) hrefIndex += 1; if (hrefIndex < hrefArr.length) { requestInfo() } else { pageIndex += 1 if (pageIndex < pageArr.length) { requestPage() } } }) } // 封装request方法为getHtml把地址和回调函数作为参数 function getHtml(url, callback) { request({ uri: url, method: 'GET', encoding: 'binary' }, function (error, response, body) { var str2 = iconv.decode(new Buffer(body, 'binary'), 'gbk'); const $ = cheerio.load(str2); callback($) }); }