项目说明
- 使用koa2.x,nodejs>=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是干嘛的
我去 这图片~
要爬就爬 meizitu.com
@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 没写过下载视频的,下载视频的网络是很大问题,程序难度不大。