Skip to content

lingo34/novel-crawler-cli

Repository files navigation

⚠️ If you don't understand Chinese, this repo is useless for you. This program aims to crawl Chinese novel websites, so almost everything (like comments) is written in Chinese

⚠️ 本软件仅供学习使用,请在下载后24小时内删除

novel-crawler-cli

基于Node.js 与 Puppeteer 的纯命令行小说爬虫,支持多个网站,且可(相对)轻易添加更多网站的适配。由于puppeteer 是操作chromium的无头浏览器,比其他方案更耗资源,但也更难被反爬虫机制检测到。

demo_june23_1.mp4

这是啥

这是年轻人的第一个爬虫项目, 是一个基于Node.JS 与puppeteer的纯命令行软件,以爬取免费小说网站上的免费小说资源。

没用python 是因为不会。用node 是因为1. 熟 2. 偶然看到了 puppeteer 这个库

目标成为一个通用小说爬虫框架,以支持更多网站。或许有机会再写个webui 也不是不行,不过那就是另一个项目了。

为什么我会想写一个爬虫?

随着我们进入大语言模型的时代,难道你不觉得这一大批的网络小说很适合拿来炼丹嘛?

小说平台自己又不练,我们只好自己练了

既然打算自己练,不如就先写个爬虫回去数据吧。可是我不会写爬虫,所以就只能先学了。

我最近发现,有一部我很久很久以前喜欢的一个小说,莫名其妙被弄没了,再也找不到了。在这个中心化的互联网结构下,你曾经喜欢或甚至付费阅读的的小说有可能因为各种原因,如网站倒闭,不可抗力等因素消失。因此,数据备份是十分有必要的。

一点点声明

这个项目只是一个爬虫项目,本身并提供破解或是小说解锁功能。

所有本工具能爬取的数据大多为网络上的公开资料,如有版权纠纷,请联系数据来源。

怎么用这玩意儿

你需要什么

首先你需要

  1. 命令行
  2. Node.js (开发用的是v20.0.0, 其他版本没测试但应该问题不大吧...)
  3. npm (装node.js 时会一起获得)

⚠️ Linux 环境下安装有大古怪,建议使用docker或参考我在dockerfile中写的安装方式

安装

找个资料夹, clone 一下这个repo

# clone 一下 这个repo,或是直接下载源代码.zip然后解压
git clone https://github.com/lingo34/novel-crawler-cli

# 然后 npm install 一下
npm install

大约280mb 的chromium 浏览器会在此时被下载到程序目录下的 .cache文件夹,如果你希望使用自己的chrome,可以删除程序目录下的.puppeteerrc.cjs文件(参考官方文档),并修改config.hjson中的executablePath参数, 参考官方文档

国内环境的大古怪

如果你在墙内,运行npm install 或第一次运行程序时有可能会因为不可抗力的原因失败。 这个时候,就先运行下面这段命令吧

PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org npm install puppeteer

参考国内下载安装 Puppeteer 的方法

运行

用node 执行 index.js

node index.js

就可以了

一些别的

关于开始章节网址,请输入第一章的网址。我能搞到目录的地址,但搞不到第一章的地址。 如果你打算从某一章开始爬取,比如第30章(可能是因为之前爬一半中断了), 直接写第30章的地址。 另外看到小说档案名前的数字了吗?重新开始时记得把那个数字设置为开始数字。这个数字与章节不一定相同。

解除安装

几乎所有跟本程序相关的档案都只会出现在本程序的文件夹内,当然,如果你是为了跑这个程序才装的node.js, 记得把它给删了。 不过如果你删除了.puppeteerrc.cjs 文件,puppeteer会把Chrome For Testing 放在 $HOME/.cache/puppeteer (mac/linux/unix) 参考官方文档

Supported Websites 目前支持的网站

如果你有想要添加的网站, 可以开个issue 或是联系我 lingo34@skiff.com, 我心情好而且很闲的时候就有机会加一下

目前支持的网站

url name 书源档案 备注
https://www.69shuba.com/ 69书吧 69shuba-com.hjson
https://www.xbiquge.tw/ 笔趣阁 xbiquge-tw.hjson
https://www.shukw.com/ 书库网 shukw-com.hjson
https://www.bifengzw.com 东流小说 bifengzw-com.hjson
https://zh.wikisource.org 维基文库 zh-wikisource-org.hjson 维基文库的格式十分复杂, 有时会有表格和图片这种本爬虫无法处理内容
https://www.qidian.com/ qd中文网 www-qidian-com.hjson 这东西不太稳定, 很玄, 如果失败了就多试几次。支持cookie 登入

打算支持的网站

  • ...更多笔趣阁
  • 番茄
  • esj 轻之国度

如果我想自己写一个书源, 我该怎么做?

你需要什么

  • 一点点关于JavaScript, 特别是关于css 选择器的内容 (你不需要会JavaScript或node.js)
  • 或许还有JavaScript中关于文字处理的内容以及正则表达式... 不过没关系, 可以让chatGPT帮你写
  • debug 的能力

本程序的书源是用hjson格式写的, 具体爬取的网页分析代码是javascript浏览器代码。 如果你想自己写一个书源, 最简单的方式就是复制一个写好的书源, 然后根据注释修改代码。这里面储存的JavaScript 代码都是会透过puppeteer, 在爬虫的无头浏览器中运行的。因此你唯一需要知道的知识, 就是JavaScript 中关于css 选择器的内容

限制

由于储存格式为纯文本, 这个爬虫并不能爬取图片或表格等富文本信息, 或许有一天会添加表格或是将html 语法转换成markdown 格式的功能, 不过目前不在计划当中, 如果有人愿意的话请务必开个pr

关于Cookie

有些网站或许会要求登入, 而众所周知, cookie 是储存登入状态的好地方。 所以只要从你的浏览器获取cookie, 再把cookie 导入到本程序里就可以了。

关于如何从浏览器中获取cookie, 可以使用像是EditThisCookie (chrome) 或是 CookieEditor (FireFox)之类的插件。 看这篇文章 Puppeteer cookie 使用,免登录 CSDN 简书 掘金

⚠️ 但是我有必要提醒你,除非你已经做过code review,否则不要把这种具有 “存取您在所有网站的数据”或 “允许这个扩充功能读取及变更你在造访过的网站留下的所有资料” 权限的插件装在你的主浏览器中。并且,使用完记得删除。获取cookie/session token是非常敏感的权限,只要能获取cookie,程序就能在不知道你密码的状况下,以你的身份登入网站。另外,由于浏览器插件的权限管理机制,如果你在启用这种插件时在网站上输入了密码,插件也可以读取你输入的密码并传送给第三方。

本程序只会在你的允许下,使用你输入的cookie进行你授权的自动登入。你的cookie只会留在你的电脑上(以及传送到你要登入的网站)。如果你不放心,请务必做code review。你不应该在你的电脑上执行任何不可信的代码。再说本程序也就几百行的node代码,而且写了一堆中文注释,读起来很快的。

获取到 json 格式的cookie 之后, 把它贴到本程序目录下的 cookie.json 文件中。如果这个文件不存在,就自己创建一个。

如果你拿到的是一个长得像 'newstatisticUUID=123456_56789876543; _csrfToken=7JHGYUi87yhj93ieuhd; fu=23432;'的字符串,而不是一个JSON,你可以使用script/ cookieStrToStandardFormat.js脚本 gist来将这种字符串转换成json cookie格式

目前进度

目前本项目才刚刚起步, 支持网站有限, 有时新增不同网站时也会有一些bug, 不过大致框架基本已经完成, 已经可以开心的爬取小说了

todo

适配更多网站, 简化适配流程

  • 拆分并模块化html解析模块
  • 弄一种匹配机制,如果是已适配的网站,直接用对应库
  • cookies 登入
  • docker 支持
  • 更新书源
  • 解决必须提供第一章url的问题, 或者说, 支持提供目录url
  • 写一个用来给书源debug 的程序, 只包含必要代码以及debug 工具
  • 把浏览器 argument 的定义交给书源?

长期目标

  • 适配更多网站,或尝试适配书源语法

为webui 做准备

  • 优化代码, 函数式编程化, 提供更多可用函数
  • 迁移web

致谢

node.js爬虫入门(二)爬取动态页面(puppeteer)

  • 教会了我怎么写爬虫, 贡献了 1/3 的代码

chatGPT & Bing GPT

  • 帮我写了 1/3 的代码

GitHub Copilot

  • 帮我写了剩下 1/3 的代码

所以四舍五入就是我根本没写代码,有版权纠纷别找我

使用的 Library

  • puppeteer, Apache 2.0 协议
  • prompt-sync, mit 协议
  • hjson, mit 协议

一些别的

小说文件名

Docker

Docker Hub: lingo34/novel-crawler-cli

拉取镜像并运行:

docker run -it \
    --name novel-crawler-cli \
    -v <output-path>:/app/output/ \
    lingo34/novel-crawler-cli:latest

-v <output-path>:/app/output/ 是小说输出目录,冒号左边是本机(修改这里),右边是容器内(别动) 可选项: -v ./config.hjson:/app/config.hjson 是可自定义的配置文件, 可以不加这行。 -v ./cookie.json:/app/cookie.json 可以导入cookie文件, 可以不加这行

Build: 从源码构建docker 镜像

# 使用最新的 buildx 工具
docker buildx build \
	-t novel-crawler-cli:latest\
	.
# 或部署给多平台
docker buildx build \
	--platform linux/amd64,linux/arm64, linux/arm/v7 \
	-t novel-crawler-cli:latest\ #加你的tag
	--push \ #build結束直接push到hub上去
	.

运行本地构建的镜像

docker run -it \
    --name novel-crawler-cli \
    -v <output-path>:/app/output/ \
    novel-crawler-cli

-v <output-path>:/app/output/ 是小说输出目录,冒号左边是本机(修改这里),右边是容器内(别动) 可选项: -v ./config.hjson:/app/config.hjson 是可自定义的配置文件, 可以不加这行。 -v ./cookie.json:/app/cookie.json 可以导入cookie文件, 可以不加这行

About

基于Node.JS 与puppeteer的纯命令行爬虫软件,以爬取小说网站上的小说资源。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors