97 lines
2.3 KiB
JavaScript
97 lines
2.3 KiB
JavaScript
////爬虫
|
||
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($)
|
||
});
|
||
} |