Gitbook2pdf :抓取 Gitbook 生成的网站生成 pdf 文件的工具

2019-03-07 10:21:36 +08:00
 fuergaosi

介绍

经常发现很多用gitbook生成的书籍质量很高
就想离线下来看
但是gitbook生成的pdf都无法复制且体积很大
有的网站甚至不提供下载的选项
就和小伙伴一起做了个工具
对于gitbook生成的网站进行抓取
解析以后使用weasyprint进行生成文件

特性

6839 次点击
所在节点    分享创造
33 条回复
aWangami
2019-03-07 19:27:16 +08:00
(Python3) ➜ gitbook2pdf python gitbook.py
Traceback (most recent call last):
File "gitbook.py", line 5, in <module>
import weasyprint
File "/Users/Python3/lib/python3.7/site-packages/weasyprint/__init__.py", line 393, in <module>
from .css import preprocess_stylesheet # noqa
File "/Users/Python3/lib/python3.7/site-packages/weasyprint/css/__init__.py", line 26, in <module>
from . import computed_values
File "/Users/Python3/lib/python3.7/site-packages/weasyprint/css/computed_values.py", line 17, in <module>
from .. import text
File "/Users/Python3/lib/python3.7/site-packages/weasyprint/text.py", line 14, in <module>
import cairocffi as cairo
File "/Users/Python3/lib/python3.7/site-packages/cairocffi/__init__.py", line 39, in <module>
cairo = dlopen(ffi, 'cairo', 'cairo-2', 'cairo-gobject-2', 'cairo.so.2')
File "/Users/Python3/lib/python3.7/site-packages/cairocffi/__init__.py", line 36, in dlopen
raise OSError("dlopen() failed to load a library: %s" % ' / '.join(names))
OSError: dlopen() failed to load a library: cairo / cairo-2 / cairo-gobject-2 / cairo.so.2

这是啥情况?
privil
2019-03-07 19:28:17 +08:00
@fuergaosi #18 抓取的时候也报错了,不过我 vps 内存真小,才 512Mb,抓原来的 k8s handbook 是不行的。

https://funhacks.gitbooks.io/explore-python
crawling : https://funhacks.gitbooks.io/explore-python/Conclusion/reference_material.html
Traceback (most recent call last):
File "gitbook.py", line 298, in <module>
Gitbook2PDF("https://funhacks.gitbooks.io/explore-python/").run()
File "gitbook.py", line 190, in run
loop.run_until_complete(self.crawl_main_content(content_urls))
File "/usr/local/python3.7.2/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
return future.result()
File "gitbook.py", line 212, in crawl_main_content
await asyncio.gather(*tasks)
File "gitbook.py", line 233, in gettext
text = ChapterParser(metatext, level).parser()
File "gitbook.py", line 95, in parser
if len(context.find('footer')):
TypeError: object of type 'NoneType' has no len()
privil
2019-03-07 19:30:23 +08:00
hooych
2019-03-07 19:38:27 +08:00
@aWangami mac python3 同 OSError: dlopen() failed to load a library: cairo / cairo-2 / cairo-gobject-2 / cairo.so.2
@fuergaosi 啥情况
hooych
2019-03-07 19:40:01 +08:00
@fuergaosi #23 多谢,安装再试下
fuergaosi
2019-03-07 19:40:07 +08:00
@privil 无法重现 这个报错是官方推荐的锅 我本来没有写 len 今天跑的时候官方提示我以后可能不让直接 if None 了 就推荐写成这样 结果成了个 bug 我这就去改
mseasons
2019-03-07 22:15:15 +08:00
@changjiangzzZ 不是 timeout 的问题,似乎是 https 验证的问题。我把所有的 get 请求参数增加 verify=False 就好了。
mseasons
2019-03-07 22:18:23 +08:00
@fuergaosi url 我没改,直接 git clone 下来运行的源码。我后面查了一下文档,将所有的 get 请求增加参数 verify=False 就通过了。
dyxang
2019-03-07 22:24:18 +08:00
好想直接用,为什么不 py2exe ?
leesymbol
2019-03-08 08:22:04 +08:00
帮顶
cye3s
2019-03-08 11:25:50 +08:00
试了个,目录结构没保留啊,比如这个
https://go.tanglei.name/content
fuergaosi
2019-03-08 14:18:46 +08:00
@cye3s 我测试了一下 目录结构保留了 不过因为有两个 404 所以少了两个章节 ![kz37f1.png]( https://s2.ax1x.com/2019/03/08/kz37f1.png) 另外希望有问题可以直接发到 issues 区
@dyxang 因为我没有 windows ┑( ̄Д  ̄)┍
soulteary
2019-05-07 23:51:07 +08:00
@fuergaosi 你的小工具很好用鸭,但是看到有些同学搞不定环境,所以我封装了一个容器镜像,代码在这里: https://github.com/soulteary/docker-gitbook-pdf-generator

如果你愿意稍微调整项目目录结构 & 打 release tag 的话,后续升级维护能够更方便,比如定制电子书风格, etc...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/541999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX