😍从 Telegra.ph 上爬取并打包漫画导入 Komga

category
date
tags
slug
password
icon
type
summary
status
转载贴个链接🤗
不容忽视的是,Telegraph 上有非常丰富的漫画资源,获取途径也较为方便,通过 tag 搜索喜欢的画师或者作品类型,很快 saved message 就会保存出长长一串漫画。但它毕竟不是漫画软件,列表式的保存也不方便检索。正好最近在研究 Komga 漫画管理平台,看到官网简介说支持 zip 格式的导入,我就想能不能批量把漫画爬取下来打包成 zip 放在上面管理(仅供自我学习使用)
同时 Tachiyomi 在最新释放的版本移除了插件的支持(一条腿打瘸),并推荐使用自我管理的漫画库(比如 Komga)作为主要的书源。可见的是,在版权大战愈演愈烈的今天,整理收集资源似乎愈加紧迫。

前情提要

Komga 漫画管理逻辑

在导入 Komga 漫画资源的时候,通常是给漫画新建一个文件夹,改成相对应的名字,再加入不同卷,不同章节范围的文件(见下图)。因此为了导入 Telegraph 上的漫画,同样的,相对应的文件夹应该对应相同的文件名称,这一点应该写进程序逻辑里。(大部分 Telegraph 上的漫画是单行本,保持和原标题一致即可。)
notion image

Telegraph 的网页端源码

我们任意打开一篇,进入开发者模式检查源码如下:
notion image
可以看到标题是在 header 的 h1 标签中,而图片则是在 <img src=str> 的标签内,漫画管理需要标题作为文件名称,图片按顺序打包。于是爬虫就需要建立匹配规则,正则删去不必要的字符串,把图片按顺序下载到指定路径打包并删除零散图片。

下载模块

图片模块

参考了 CSDN 上的思路并进行一些逻辑的补充,避免创建文件夹失败以及重复下载的问题。以下函数实现获取图片url和下载图片:

压缩模块

对文件夹内的图片进行遍历放入 zip 文件中,然后删掉零散图片:

Epub 模块

这是一个可选项,因为设计初衷只是将漫画打包成 zip 导入服务器,但为了更广泛的阅读器支持,便使用 ebooklib 库实现图片集转 epub 电子书的功能。
通过了解 epub 的封装,我们要为书本创建元数据与索引,因此在遍历图片并加入书本的同时,要为图片添加对应的 html 索引并加入 toc 的 nav 中确保能够找到对应页,再选取第一张图片作为漫画的封面兼书脊,最后完成封装。
在进行书籍创建的时候,有一个小问题需要注意:图片索引默认是按字符串索引而不是数字索引,所以需要对图片列表进行重排序。
以下是创建的完整逻辑:

下载主模块

导入环境变量

这里导入的参数是从另一个文件 env.py 中获取,变量通过 Docker 或者手动定义传入。

获取Headers

做人要实诚,是爬虫就告诉服务器我的 header 是 python (

文件标题

利用 bs4 BeautifulSoup() 函数获取 h1 大标题。
这里获取的 manga_title 经由提取为 tag 类型,需要转成 str 类型,同时替换文件名中的非法符号以及 “—Telegraph” 尾缀。
这时候 converted_title 就是我们稍后要用到的字符串了。

调用函数内部的多线程下载逻辑

限制并发线程避免占用太高,同时保证较快的下载速度

打包图片

调用 zip_folder() 或者 create_epub() 函数进行封装操作。

GUI模块

为了调用方便,不敲命令行,同时做到多开下载任务,便使用自带 tkinter 库编写了一个简单的 GUI,只需要输入下载地址和链接就可以一键回车愉快下载。

Telegram Bot 模块

最初想法是能不能给作为前端的 bot 转发一堆链接,然后直接丢给下载模块执行免去复制粘贴之苦,好在 tgbot 有丰富的三方库支持,写起来不算太困难,这里选择使用 python-telegram-bot 作为主框架完成前端响应。

获取链接导入 Komga 的事件流程

由于 bot 的执行逻辑是从上一个异步函数结束的返回值跳转到其所对应的 Messagehandler() 的事件传递,同时不能使用 while 导致 bot 卡死在一个过程,于是获取链接的操作使用 file “a” 模式下的写入实现类似循环导入链接的效果。

Bot 主循环

创建 bot 实例 → 接受用户输入 → 循环 telegraph_komga_link_received ,直到用户命令停止 → 周期结束。

主程序

光有 bot 把链接收集起来肯定不行,主程序的目的就是用来启动 bot 模块,监控链接所在的文件,将链接读进队列并交给下载模块异步执行,代码如下:

部分展示

GUI

notion image

Docker 部署

notion image

Bot 事件

notion image

Logger

notion image

Epub(在普通阅读器的读取效果)

notion image

小结

干了个在很多大佬眼里没啥技术含量的活,但毕竟算是自己的学习过程,而且基于自身需求去写代码还是第一次,看着漫画转移平台的结果还是很开心的(●'◡'●)(谁不喜欢漫画海报墙呢?/doge)
btw,小脚本已经上传 GitHub 方便学习使用。
上一篇
自组Nas搭建日志
下一篇
玩梗逐渐成为一种潮流的利弊之辩
Loading...