使用koa写一个漫画下载的爬虫
发布于 8 年前 作者 maochunguang 8429 次浏览 来自 分享

项目说明

  • 使用koa2.xnodejs>=7.6,
  • 使用async await解决异步,
  • 使用request-promise配合async await解决请求异步
  • 使用cheerio处理选择img标签

核心代码,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];
}

代码地址,有需要可以看看

koa-spider代码地址

代码运行效果

GQ)PW}B)7UYH6LZ_SFE~AG7.png

下载美女图片的效果

test.png

18 回复

欢迎拍砖,我会虚心接受!

用koa是干嘛的

我去 这图片~

@Alexis374 用express也可以,都只是启动个server而已,我用koa只是想用async await

@hellojukay 稍微改一下就可以爬这个网站

没有必要用Koa吧,完全可以做成一个CLI应用啊……

@Equim-chan 用啥都行,看喜好呗,用koa是想继续扩展,做成一个通用的爬虫模型

可以爬1024 哈哈

@maochunguang 其实我也做过类似的东西(爬的E站,比较简单),用了promise-map-limit来控制并发。

@Equim-chan 可以把连接发一下,我放在一起,做个比较

@maochunguang 因为这个用途有点羞耻(?,所以我还没有发布到什么地方,只是自己拿来用

@Equim-chan 这没啥,说不定别人也有这个需求,关键是分享

@maochunguang 我可以先私发一个给你看看

我爬过pixiv.net,主要搞一些二次元的同人作品 厚脸皮贴个链接: PHelper

一点建议 1.爬取链接和下载图片完全分离,两者的流量和耗时不是一个级别的 2.用多进程来爬,控制好并发 3.就算做通用模型也必要用koa,除非你想山寨一个一样的网站

@Yuki-Minakami 建议很好,我试着改改看

整天扒图片,还不如多扒小黄片的磁力链接然后分享出来,哈哈哈

@semicoyoung 没写过下载视频的,下载视频的网络是很大问题,程序难度不大。

回到顶部