好吧,让我们从头说起。

众所不周知,我有了我自己的博客,于是就想把我的知乎内容同步到博客上去(目前还空空如也)。但是,出于能犯懒就犯懒的原则,我决定做一个自动化程序,自动将知乎上的文章转换成Markdown食用。嗯……结果还挺满意的,就是好像时间耗费的长了一点(三个月啊,中间搁置了两个月零30天)。。总之,我Python爬虫,成功构建了一个知乎2MD全自动转换器!这中间过程坎坷,于是便想发此文纪念一下(话说我在知乎上讨论如何爬取知乎是不是有那么亿点点不合适啊……)。当然,如果你想要代码,我也发布到了GitHub上,欢迎star和fork!

万恶之源

爬取知乎很烦人,倒不是因为它反爬有多厉害,是因为它使用的是前端动态框架React,变向地增加了它的爬取难度。但是,有一个好消息是,知乎的文章界面并没有采用动态渲染,所以我们可以直接使用requests和BeautifulSoup进行爬取。但是获取到HTML不是最主要的,最主要的是去解析HTML树,根据HTML去生成相应的Markdown代码。

有人肯定会说,为什么不用现成的库呢?我也想到过这个问题。本着不要重复造轮子的心理,我去网上搜了一下,有很多支持Python的HTML2MD转换器:

好多这个的教程和库,用的最多的就是HTML2Text

但是,当我试了一个又一个的时候,我发现没有一个能完美兼容知乎的HTML架构。要么就是图片无法识别,要么就是代码块不识别语言,反正对于我之中对图片和代码都有需求的人是不可能使用的。于是,我放下心来,自己来开发这个程序。

坎坷的解析

普通的链接,文字,代码块还比较好弄,但是像图片和视频就不是很好解析了。我没有使用递归解析,而是每处理一个元素就删掉一个,使用一个while循环来控制。我用的最笨的方法,每个元素都对应一个if,要注意知乎的视频是不能在Markdown里显示的,因为它的链接是动态获取的,而且链接都是加密过的。所以,遇到视频我只能够使用链接来当一个替补了。顺便提一下关于代码识别语言的事,知乎使用的API跟highlightjs的非常像,甚至我认为知乎就是使用了一个自定义主题的highlightjs。可以直接根的非常像,甚至我认为知乎就是使用了一个自定义主题的highlightjs。可以直接根据highlightjs文档来进行爬取啦。

效果展示

OK,说了这么多别人的库不好,我给大家看一看我的转换器转换出来的效果吧(文章使用的是这篇):

好啦,今天就先记录到这里,最后再献上我的GitHub仓库,欢迎star和fork哦:

最后,不点个赞再走嘛~