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

EE-Book 简介

  •  1
     
  •   knarfeh
    knarfeh 2016-03-19 20:36:05 +08:00 5543 次点击
    这是一个创建于 3549 天前的主题,其中的信息可能已经有所发展或是发生改变。

    缘起


    在知乎「发现(大 V 们)更大的世界」的过程中,我发现了一个开源项目ZhihuHelp,刚好初学 Python ,于是跟着慢慢地学习,写了一些简单爬虫,写正则表达式,学 BS 库,学 EPub 格式电子书的组织结构,后来开始给知乎助手这个项目提 Issues , pull requests ,再到后来,根据自己的需要写了简书的版本,能够把某个博主的所有博文做成电子书,如,把王垠的所有博客做成 EPub 格式的电子书:

    wangyin

    地址是:jianshu2e-book

    再后来,我又写了新浪博客的版本,如,把韩寒的博客做成 EPub 格式的电子书:

    hanhanblog

    地址是:SinaBlog2e-book

    我是 Kindle 重度用户,这几个程序的功能对我很有帮助,用着用着,有一天我突然想到,其实这样的需求还真不少,我应该把这个程序变成一个框架,把需要爬取的网站作为一个个模块放在里面,于是便有了EE-Book

    所以, EE-Book 是什么?

    简单来说, EE-Book 能够让你把某网站的特定内容爬取下来做成 EPub 格式的电子书。

    它是桌面程序,用 Python+PyQt 开发,在各种主流平台都可以使用。这个程序将是模块化,社区化的,任何人只要有需求,都可以提 Issues ,或者 pull requests ,然后这个模块将会添加到程序中,这样大家都能用了。当然这里的「提 Issues ,或者 pull requests 」是广义的概念,它可以是 github 项目主页的页面,也可以是独立的论坛,这个程序正在开发中,暂时没有 Web 的版本,以后开发对应的网站也未尝不可。

    example

    小 A 是一个播客重度用户,刚开始学 Python ,有一天他开始听talk python to me,在 iTunes 下载之后,他发现这个节目的网站上几乎所有的episodes都有对应的文稿,「真不错,可以学 Python ,可以练听力,还可以学英语」,但问题来了,小 A 用电脑的时候根本没空听 Podcast ,而这个播客的主页又没有做移动端的适配,拿手机完全没办法看,于是他提了一个 Issue ,程序员小 B 看见了这个 Issue ,嘿,刚好我也在听这个,就写这个模块方便大家吧,于是 EE-Book 就有了这一模块,小 A 制作了电子书,终于可以拿着手机, kindle 阅读了。

    这样的场景当然还有很多。网络上的资源参差不齐,我们不缺阅读资源,我们缺的是深度阅读, EE-Book 就可以给我们一个选择,在网络不便的时候,在需要断绝干扰深度思考的时候,我们可以利用 EE-Book 的功能进行深度阅读。

    这个是我的最初想法,说来惭愧,不久前才了解到 calibre 这个图书管理软件,当时后台部分写得差不多了,我模仿 calibre 的 Fetch News 界面写了一个简单的 GUI ,但当时并没有深入了解 recipe 的功能,最近才发现 calibre 的 recipe 非常强大,一些想法在 calibre 的 recipe 功能中已经有了实现,但不管怎么样,这个轮子我打算继续造下去,一方面是为了学习 Python+PyQt ,另一方面,我可以做 calibre 做不到的事情, calibre 开发了近 10 年,代码量很大,很重,而 recipe 需要按照一定的规范编写,有一定的局限性, EE-Book 会将重点放在 EPub 格式电子书的制作上,自由度很高,可以高度定制样式,不管是什么反爬虫的措施,都可以进行各种方式的 hack ,保证书籍的质量。 recipe 能否做到,我刚接触,不确定,但我确信既然 recipe 是基于 calibre 这个框架的,一定有它的局限性,并没有对 recipe 的每一个功能都很了解,这也是我发这个帖子的原因,我想要分享这个项目,希望各位能给出一些意见,或者谈谈 calibre 的缺点是什么,任何建设性的意见或建议我都会虚心接受,更希望有人参与进来,到项目主页提 issue 也好,说说需求,搞不好哪天 EE-Book 就可以制作你想要的电子书了。而且目前刚开始写 PyQt ,也遇到了一点困难,希望老手能够指点一二。

    其实 calibre 的 recipe 应当火起来才对的,但很多人甚至都没有听说过,我觉得这个是有原因的,一个普通的没有写过代码的读者,听说了 calibre 的这个功能,他看到 recipe 的实现方式,心想要自己写代码,可能就望而却步了。事物的发展总是从简单到复杂再到简单, EE-Book 要做的事情就是从复杂到简单,代码的部分留给社区来做,利用这个框架,可以很快地添加模块,而普通的用户提 issue(甚至奖赏),就可以完成自己想要的电子书的制作。 recipe 针对的是某个网址,需要根据某个页面写代码,而 EE-Book 针对的是整个网站,比如制作知乎这种类型的电子书,只需要提供一个网址,如示例:

    zhihu_kind_info

    就可以制作相应的电子书,在命令行下,只需要把网址写入 ReadList.txt 文件中,运行即可获得 EPub 格式的文件,在 GUI 界面下,只需要把网址写到文本编辑框中,点下载即可。 最新版知乎助手生成的电子书是这样的(当然这些样式都可以自己写):

    book_demo

    这里再次向知乎助手的作者表示感谢,我的程序基于这个框架,也请大家多多支持这个软件的发展,知乎助手的作者正在开发网页版,有时间,有兴趣的朋友也可以一起参与。

    依葫芦画瓢,我写了新浪博客、简书的部分,精力有限,都还比较简陋。目前 EE-Book 有这三个模块:

    zhihu_jianshu_sinablog

    目前代码耦合度还比较高,正在调整,开发中。刚开始学 PyQt ,写的 GUI 界面实在是很简陋,请多担待,也请大家多多提意见:)

    说说想法,提 issue ,哪怕写要爬取的网站需求都行~

    34 条回复    2016-08-16 12:14:33 +08:00
    yaozeyuan93
        1
    yaozeyuan93  
       2016-03-19 20:44:21 +08:00   1
    来顶一个←_←
    wizardforcel
        2
    wizardforcel  
       2016-03-19 20:49:00 +08:00
    突然想起自己之前也写过简书的。。只不过是拿 node 重新写的

    https://github.com/wizardforcel/jianhelper
    knarfeh
        3
    knarfeh  
    OP
       2016-03-19 20:58:03 +08:00
    @yaozeyuan93 知乎助手的作者~~~谢谢~
    knarfeh
        4
    knarfeh  
    OP
       2016-03-19 20:59:44 +08:00
    @wizardforcel 啊哈哈哈,以后学 node 的时候跟着学习一下, node 是将来一定会学的!
    mliilm
        5
    mliilm  
       2016-03-19 21:09:51 +08:00
    能不能爬微信公共号的历史文章?
    knarfeh
        6
    knarfeh  
    OP
       2016-03-19 21:25:03 +08:00
    @mliilm 貌似腾讯反爬虫比较强大,不过魔高一尺道高一丈啦,有机会写写试试~
    marenight
        7
    marenight  
       2016-03-19 22:33:07 +08:00
    想问下将 rss 制作博客电子书有什么比较好的工具。
    IwfWcf
        8
    IwfWcf  
       2016-03-19 23:58:44 +08:00
    赞,很有意思的工具
    addbook
        9
    addbook  
       2016-03-20 00:11:04 +08:00
    不错
    Abirdcfly
        10
    Abirdcfly  
       2016-03-20 01:29:14 +08:00 via iPhone
    赞。。。 calibre 的优势在早ω,国外开源的在线电子书很多都有对应的 py 文件。。但是它不是用来处理这种类似知乎某个用户的回答这种页面不完全一样的页面(此处存疑。我看过的源文件不多。。)。

    好想贡献源码。。可惜最近事多。。哭。。。
    regent
        11
    regent  
       2016-03-20 04:34:33 +08:00 via iPhone
    支持,其实就是大家贡献规则,然后不断更新,最后达到即开即用的效果。
    个人希望能探索将微信公众号文章打包的功能,不用太多,近期的就够用。微信公众号要是能转 rss 就好了。
    话说楼主考虑过用 rss 做源么?用户定制 list ,然后自动抓取一圈打包。当然,问题是不同网站的内容如何在设备上呈现美观易读
    knarfeh
        12
    knarfeh  
    OP
       2016-03-20 08:21:51 +08:00
    @marenight 你可以试试 calibre 。 calibre 的 recipe 功能最方便的可能就是 rss 订阅了,只需要导入一个 OPML 文件,我尝试了一下,不在乎页面样式的话,抓取最新的文章还是可以的,貌似没有办法抓取全部文章,而且如果有的博客 rss 输出只输出摘要,不输出全文,这个就没有什么意义了
    knarfeh
        13
    knarfeh  
    OP
       2016-03-20 08:22:38 +08:00
    @IwfWcf
    @addbook thanks ,有机会一起来玩
    knarfeh
        14
    knarfeh  
    OP
       2016-03-20 08:25:53 +08:00
    @Abirdcfly 对对对,我就是在怀疑这一点,不确定 calibre 能不能搞定这种情况,希望写过复杂 recipe 的大牛来打我脸。。。贡献代码不着急啊,没事没事,慢慢来:)
    simoncos
        15
    simoncos  
       2016-03-20 08:26:36 +08:00 via iPad
    很有趣啊,顶
    steveway
        16
    steveway  
       2016-03-20 08:30:43 +08:00
    赞一个 能直生成 mobi 就更好了,省去再转一次的麻烦。
    dobest
        17
    dobest  
       2016-03-20 08:31:46 +08:00 via Android
    作为 kindle 用户,这个要支持一下。有机会还是想参与进来的。
    knarfeh
        18
    knarfeh  
    OP
       2016-03-20 08:32:36 +08:00
    @regent 考虑过 rss 做源,但是这种方式貌似有限制,因为 rss 的核心是推送网站最新更新,如果一个 OPML 文件下有多种 feed ,就很难保证输出的电子书有很好的质量,因为对应的是多个网站的内容。用 rss 的话感觉像是做杂志了,不过也未尝不可
    knarfeh
        19
    knarfeh  
    OP
       2016-03-20 08:35:21 +08:00
    @steveway 因为 EPub 这种标准比较开放嘛,而 mobi 是亚马逊推动的(噢万恶的亚马逊想搞电子书行业的垄断),可能的话,以后加上生成 mobi 的功能
    knarfeh
        20
    knarfeh  
    OP
       2016-03-20 08:35:44 +08:00
    @simoncos
    @dobest 来来来~一起来玩
    dphdjy
        21
    dphdjy  
       2016-03-20 08:58:15 +08:00 via Android
    ()加上贴吧源和 discuz 源,这是极好的~(有空再来
    knarfeh
        22
    knarfeh  
    OP
       2016-03-20 09:02:09 +08:00
    @dphdjy thanks,thanks!
    wizardforcel
        23
    wizardforcel  
       2016-03-20 10:37:30 +08:00
    我最近在想这种东西能不能做成可配置的,就比如指定 url 和几个选择器(链接、标题、正文)就可以抓取满足要求的东西。
    knarfeh
        24
    knarfeh  
    OP
       2016-03-20 10:47:32 +08:00
    @wizardforcel 会朝这个方向努力,但我更倾向于保留自由度,要写成完全通用的框架基本不可能,因为网页的类型多种多样,比如知乎问答,百度贴吧这种就不是简单的标题+正文
    qa52666
        25
    qa52666  
       2016-03-20 16:14:41 +08:00
    支持一个
    mycccc
        26
    a href="/member/mycccc" class="dark">mycccc  
       2016-03-21 10:01:35 +08:00
    可以考虑爬取搜狗的微信公众号内容
    knarfeh
        27
    knarfeh  
    OP
       2016-03-21 11:05:30 +08:00
    @mycccc 谢谢,确实在考虑^_^"
    Is0
        28
    Is0  
       2016-03-23 13:12:31 +08:00
    我用 calibre 抓松鼠会的 rss 只有最近的,能问下怎么能全部爬下来? 求帮忙看看 http://songshuhui.net/archives/tag/%E5%8E%9F%E5%88%9B 想全爬下来慢慢看
    knarfeh
        29
    knarfeh  
    OP
       2016-03-23 14:47:21 +08:00
    @Is0 想全部爬下来,似乎要自己写代码~
    Is0
        30
    Is0  
       2016-03-23 17:33:05 +08:00
    @knarfeh 还是多谢啦 如果 calibre 爬 rss 有全爬下来的方法吗?
    moufuli
        31
    moufuli  
       2016-08-09 09:20:05 +08:00
    不要通过邮件发送已生成的 epub 文件,因为附件是有大小限制的(我在网页的制作的全挂。。。)
    另外客户端在哪里下载?使用教程?
    knarfeh
        32
    knarfeh  
    OP
       2016-08-09 09:37:27 +08:00
    @moufuli https://github.com/knarfeh/EE-Book 目前你可以用命令行生成。最近比较忙,有段时间没有看了,这个周末我会更新一下
    moufuli
        33
    moufuli  
       2016-08-16 11:28:14 +08:00
    心好累。。。新手从 0 开始折腾 python , 2.5 个小时过去了,依旧没有生成 epub 。。。代码显示如下:“……所有内容抓取完毕,开始对页面进行解析…… 网页内容解析完毕…… TypeError: sequence item 0: expected string, NoneType found ……” 能解答下吗?
    knarfeh
        34
    knarfeh  
    OP
       2016-08-16 12:14:33 +08:00
    @moufuli 啊哈,有用最新代码吗?你给的信息不是很全,如果有需要就私信我吧,我的邮箱是 knarfeh(at)outlook.com
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2513 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:02 PVG 15:02 LAX 23:02 JFK 02:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86