V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
MXXXXXS
V2EX  ›  分享创造

分享一个自用的爬漫画框架

  •  
  •   MXXXXXS · 2022-09-11 22:48:24 +08:00 · 2013 次点击
    这是一个创建于 589 天前的主题,其中的信息可能已经有所发展或是发生改变。

    迫于某部动画因为疫情停更, 为了满足好奇便去找漫画看

    想起很久之前写过爬漫画的爬虫, 但结构混乱无法复用

    这次好好整改了代码, 形成了一个可方便使用的框架, 感觉不错分享出来

    以下是 Readme, 代码仓库地址: comic-spider

    Comic-spider

    一个通用的漫画爬虫框架

    注意: 本项目不针对任何特定站点, 不包含任何实际的代码实现, 仅提供一个思路框架

    框架设计

    网站数据访问

    为了模拟人类的行为, comic-spider(以下简称 cs)使用 puppeteer 来访问网站数据

    这给予了实现者丰富的 api 来操作网页内容, 更加方便

    数据获取流程

    cs 的原本设计目标是下载漫画, 数据获取流程是模仿人类用户访问的行为的

    通常的一部漫画会有一个目录页面, 方便用户选择章节

    cs 暴露了一个abstract class Spider, constructor接受一个indexUrl参数, 用于指定目录页

    打开目录页后, 需要从页面中提取出所有章节的入口, 使用者需要实现getChapterEntries来返回一个所有章节入口 url 的数组

    有了所有章节的入口 url 的数组, 接着 cs 会按照顺序一个个打开各个章节入口页面, 一次同时打开的页面数量可通过pageParallelCounts配置

    打开某一章节内容页后, 需要获取本章节的页数, 实现者需要实现getChapterPageCounts来返回本章节的页数. 页数用于告知 cs 何时完成本章节爬取

    打开某一章节内容页后, 需要获取具体的图像, 实现者需要实现getImageUrls来返回本章节包含的漫画图像链接, 返回一个数组, 因为有时一个页面不止一页漫画

    打开某一章节内容页后, 需要获取下一页的链接, 实现者需要实现getNextPageUrl来返回下一页的链接

    获取到章节内容页的图片链接后, 依据链接, 实现者需要指定图像的保存位置, 需要实现getImageSavePath来从链接生成对应的图像文件下载保存路径

    如何使用

    前置知识: web 前端基础, ts, nodejs, 了解 puppeteer

    注意: 由于懒得折腾, 作者只在 mac 上实际跑过, 期待 win11 的 wslg

    使用yarn来安装依赖

    实现者需要基于Spider来自己实现细节, 参考src/examples/spiderExample.ts

    具体实现的文件入口路径为src/app/app.ts, 可以从src/examples/spiderExample.ts复制过去

    实现后, 使用yarn build-dev编译, 之后node out/app.js运行

    调试

    推荐使用 vscode, 项目带有 vscode 的调试配置

    yarn build-dev后, 在调试面板启动调试即可

    自定义

    配置代理

    Spiderconstructor 参数指定proxy, 为一个 http 代理服务器地址, 暂未实现用户认证; 常见的情况是本地 clash 的代理地址

    配置请求头

    Spiderconstructor 参数指定headers, 类型为[string, string][]

    并发页面数量

    Spiderconstructor 参数指定pageParallelCounts, 控制 puppeteer 一次开启的页面数量(并行爬取多个章节)

    为了模仿人类, 打开下一页时配置延迟与抖动

    Spiderconstructor 参数指定throttle(毫秒), throttleRandom(毫秒), 每次爬完一页, 等待一会儿再翻页

    只爬取某个范围内的章节

    Spiderconstructor 参数指定chapterRange, 在getChapterEntries获取全面章节后, chapterRange会作为全部章节.slice的参数, 来指定具体爬取的章节范围

    显示 puppeteer 界面

    Spiderconstructor 参数指定headlessfalse, 默认为true

    License

    MIT @MXXXXXS

    6 条回复    2022-09-12 11:57:39 +08:00
    whitecosm0s
        1
    whitecosm0s  
       2022-09-11 23:55:00 +08:00
    https://mox.moe 直接推送 Kindle
    ila
        2
    ila  
       2022-09-12 00:44:55 +08:00 via Android
    建议试试 cdp,Golang 写的
    MXXXXXS
        3
    MXXXXXS  
    OP
       2022-09-12 09:11:13 +08:00
    @whitecosm0s wo, 这个网址不错, mark
    MXXXXXS
        4
    MXXXXXS  
    OP
       2022-09-12 09:12:27 +08:00
    ~~网址不错~~ 网站不错, 内容很全也很简洁
    MXXXXXS
        5
    MXXXXXS  
    OP
       2022-09-12 09:21:52 +08:00
    @whitecosm0s 啊, 要 vip 充值, 当我没说
    whitecosm0s
        6
    whitecosm0s  
       2022-09-12 11:57:39 +08:00
    @MXXXXXS 不用的,有免费额度
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3371 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 11:56 · PVG 19:56 · LAX 04:56 · JFK 07:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.