起因
同学希望可以下载这个网站的连载漫画,之前爬过小说了,那么这次就来漫画吧,下载下来有快一个G的大小,162部,每部大约有二十几张图片。。
未解决的问题
下载一定时间后服务器端不响应,虽然可以通过setTimeout来控制每次发送请求的间隔,但觉得依然指标不治本。基本上下完一部后间隔3s的话下载五十部左右后会挂,需要手动重启。我总共重启了三次
需要解决并解决的问题
异步与同步问题
问题
因为为了方便按顺序观看,以及防止一次请求过多导致服务器端断开连接,需要选择使用同步方式设计逻辑,但是Nodejs的一大特色就是异步,第一次我没有处理直接异步发送请求,下载了几张图片之后服务器主动断开连接。。解决
将最新es6的async-await与Promise结合使用,效果超级棒,完全实现同步,async-await的入门教程请移步这里,至于Promise嘛,我之前也总结过一篇 :-)注意事项
使用async-await的文件在用node启动时需要加上--harmony-async-await
后缀,而且node版本要是 7.0+的才行
无法根据页面获取图片链接
问题
这个网站似乎是等页面加载完全时在动用脚本来载入图片的,所以使用简单的request模块获取的页面中没有图片链接,而且翻页也是通过脚本进行的,亦无法获取下一张图片的链接解决
就事论事,从浏览器界面中获取多个图片链接,寻找链接的命名规律,这样以一个图片链接为入口,就可获取全部图片的链接
项目结构
- src文件夹用于存放下载后的漫画,具体是这样
- download.js 脚本主入口
- download_comic.js 用于下载一册漫画的模块
- download_img.js 用于下载一页漫画(一张图片),并保存本地的脚本
- get_list_uri.js 用于获取目录信息(这个模块可有可无,因为下载下的目录对应的书的页面无法获取img的uri的)
使用到的第三方模块
- request 获取页面
- cheerio 分析页面
项目源代码与注解
//get_list_uri.js
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const path = require('path');
// 主入口
const main_uri = '