項目搭建
- 安裝nodejs>7.6,安裝koa-generator
- 直接
koa2 spider
,生成項目 - 安裝request,request-promise,cheerio,mkdirp
- npm install安裝依賴
思路
圖片或者漫畫爬蟲的思路很簡單,首先觀察url的規律,把url按規律加入到下載任務,其實就是請求獲得html內容,然后對html進行解析,找到下載的圖片url(一般都是img標簽的src屬性值),把url放到數組保存,使用async await控制所有的任務,直到把所有的圖片下載完。
難點
但是nodejs本身上異步的,如果你直接在for循環里去下載,肯定是不行的,必須控制好異步的執行上關鍵。
爬蟲簡單,處理好異步難。這里我使用的es7中async,await配合promise解決異步問題,還可以使用async模塊,eventproxy,等等異步控制模塊來解決。
核心代碼,spider.js
const fs = require('fs');
const request = require("request-promise");
const cheerio = require("cheerio");
const mkdirp = require('mkdirp');
const config = require('../config');
exports.download = async function(ctx, next) {
const dir = 'images';
// 圖片鏈接地址
let links = [];
// 創建目錄
mkdirp(dir);
var urls = [];
let tasks = [];
let downloadTask = [];
let url = config.url;
for (var i = 1; i <= config.size; i++) {
let link = url + '_' + i + '.html';
if (i == 1) {
link = url + '.html';
}
tasks.push(getResLink(i, link))
}
links = await Promise.all(tasks)
console.log('links==========', links.length);
for (var i = 0; i < links.length; i++) {
let item = links[i];
let index = item.split('___')[0];
let src = item.split('___')[1];
downloadTask.push(downloadImg(src, dir, index + links[i].substr(-4, 4)));
}
await Promise.all(downloadTask);
}
async function downloadImg(url, dir, filename) {
console.log('download begin---', url);
request.get(url).pipe(fs.createWriteStream(dir + "/" + filename)).on('close', function() {
console.log('download success', url);
});
}
async function getResLink(index, url) {
const body = await request(url);
let urls = [];
var $ = cheerio.load(body);
$(config.rule).each(function() {
var src = $(this).attr('src');
urls.push(src);
});
return index + '___' + urls[0];
}
基礎配置
由于爬蟲的復雜性基于不同的網站,不同的任務很不一樣,這里只是把幾個常用的變量抽取到了config.js。
module.exports = {
//初始url
url: 'http://www.xieet.com/meinv/230',
size: 10,
// 選中圖片img標簽的選擇器
rule: '.imgbox a img'
};
運行代碼
- 下載我上傳的代碼koa-spider
- npm install,npm start即可運行
總結
其實無論是寫爬蟲還是些其他程序,使用nodejs很大一部分都是要處理異步,要學好nodejs必須學好異步處理。
如果文章對你有幫助,請去我的博客留個言吧! 我的博客