好吧,让我们从头说起。
众所不周知,我有了我自己的博客,于是就想把我的知乎内容同步到博客上去(目前还空空如也)。但是,出于能犯懒就犯懒的原则,我决定做一个自动化程序,自动将知乎上的文章转换成Markdown食用。嗯……结果还挺满意的,就是好像时间耗费的长了一点(三个月啊,中间搁置了两个月零30天)。。总之,我Python爬虫,成功构建了一个知乎2MD全自动转换器!这中间过程坎坷,于是便想发此文纪念一下(话说我在知乎上讨论如何爬取知乎是不是有那么亿点点不合适啊……)。当然,如果你想要代码,我也发布到了 GitHub 上,欢迎star和fork!
万恶之源
爬取知乎很烦人,倒不是因为它反爬有多厉害,是因为它使用的是前端动态框架React,变向地增加了它的爬取难度。但是,有一个好消息是,知乎的文章界面并没有采用动态渲染,所以我们可以直接使用requests和BeautifulSoup进行爬取。但是获取到HTML不是最主要的,最主要的是去解析HTML树,根据HTML去生成相应的Markdown代码。
有人肯定会说,为什么不用现成的库呢?我也想到过这个问题。本着不要重复造轮子的心理,我去网上搜了一下,有很多支持Python的HTML2MD转换器:

但是,当我试了一个又一个的时候,我发现没有一个能完美兼容知乎的HTML架构。要么就是图片无法识别,要么就是代码块不识别语言,反正对于我之中对图片和代码都有需求的人是不可能使用的。于是,我放下心来,自己来开发这个程序。
坎坷的解析
普通的链接,文字,代码块还比较好弄,但是像图片和视频就不是很好解析了。我没有使用递归解析,而是每处理一个元素就删掉一个,使用一个while循环来控制。我用的最笨的方法,每个元素都对应一个if,要注意知乎的视频是不能在Markdown里显示的,因为它的链接是动态获取的,而且链接都是加密过的。所以,遇到视频我只能够使用链接来当一个替补了。顺便提一下关于代码识别语言的事,知乎使用的API跟highlightjs的非常像,甚至我认为知乎就是使用了一个自定义主题的highlightjs。这样,我们就可以直接根据highlightjs文档来进行爬取啦。
效果展示
OK,说了这么多别人的库不好,我给大家看一看我的转换器转换出来的效果吧(文章使用的是这篇):
1# 番外篇:爬取百度 2 3[知乎视频www.zhihu.com](https://www.zhihu.com/zvideo/1272864710321516544) 4 5更新20201003: 6 7BaiduSpider已经从原有的samzhangjy/BaiduSpider移至了BaiduSpider/BaiduSpider啦! 8 9更新20200801: 10 11BaiduSpider有CLI啦!想体验的可以自行阅读README: 12[https://github.com/BaiduSpider/BaiduSpider/tree/master/baiduspider/cli](https://link.zhihu.com/?target=https%3A//github.com/BaiduSpider/BaiduSpider/tree/master/baiduspider/cli) 13 14更新20200724: 15 16BaiduSpider有网页版啦!想尝鲜的童鞋们请在下面的链接里体验(因为服务器在国外,所有会有点慢,请谅解) 17[BaiduSpiderbaiduspider.now.sh](https://link.zhihu.com/?target=https%3A//baiduspider.now.sh) 18*** 19这两天在弄爬虫,没有弄Flask,就整了一个百度爬虫自己玩。做着做着就上瘾了,想着就开源了吧,于是就把代码放到了 20[GitHub上](https://link.zhihu.com/?target=https%3A//github.com/BaiduSpider/BaiduSpider) 21。目前实现的功能有百度网页搜索,百度图片搜索,百度知道搜索,百度视频搜索,百度资讯搜索,百度文库搜索,百度经验搜索和百度百科搜索。 22 23演示一下百度网页搜索的返回值(是第一页,可以自定义爬取的页码): 24```python 25{'results': [{'result': 75100000, 'type': 'total'}, 26 {'results': ['知乎官网入口', 27 '知乎网首页', 28 '知乎这个软件是干嘛用的', 29 '知乎为什么被叫做b乎', 30 '知乎手机网页版', 31 '知乎官网登首页', 32 '知乎搜索入口', 33 '知乎app下载安装', 34 '知乎上都是一群什么人'], 35 'type': 'related'}, 36 {'results': [{'author': '腾讯新闻', 37 'time': '22小时前', 38 'title': '影院停摆之际,知乎加码影视宣发'}, 39 {'author': '砍柴网', 40 'time': '1天前', 41 'title': '知乎CTO李大海:谢邀,来分享下内容社区的AI架构搭建...'}, 42 {'author': '刺猬公社', 43 'time': '53分钟前', 44 'title': '“国家队”在知乎破圈'}, 45 {'author': '央广网', 46 'time': '2天前', 47 'title': '“我们的太空”知乎关注破百万 周源受聘“航天文化...'}, 48 {'author': '网易', 49 'time': '1天前', 50 'title': '知乎扎心高赞:30岁还没有走到管理岗的人,后来怎么样...'}], 51 'type': 'news'}, 52 {'des': '有问题,上知乎。知乎,可信赖的问答社区,以让每个人高效获得可信赖的解答为使命。知乎凭借认真、专业和友善的社区氛围,结构化、易获得的优质内容,基于问答的内容生产...', 53 'origin': '知乎', 54 'title': '知乎- 有问题,上知乎', 55 'type': 'result', 56 'url': 'http://www.baidu.com/link?url=BRjVvTl__HWSymJmMuILwwm1bdP5t9O7pGhx5mVyTcO'}, 57 {'des': '有问题,上知乎。知乎,可信赖的问答社区,以让每个人高效获得可信赖的解答为使命。知乎凭借认真、专业和友善的社区氛围,结构化、易获得的优质内容,基于问答的内容生产...', 58 'origin': '知乎', 59 'title': '发现-知乎', 60 'type': 'result', 61 'url': 'http://www.baidu.com/link?url=M6JrlssNmgrADeSZnReZ-I6ipIxBTmZG-CqNr6oan34Q6yUY0DiEHsOYcWATBG0Q'}, 62 {'des': '知乎是中文互联网知名的可信赖问答社区,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。知乎以「让...', 63 'origin': '知乎', 64 'title': '知乎-知乎', 65 'type': 'result', 66 'url': 'http://www.baidu.com/link?url=LNpiNwKAO-6HtjBgJ4mXCN7hzGbDn_RHPsmKt2qbXW6EwcHd3VGNQrG-KZSkpLaP'}, 67 {'des': '知乎是中文互联网知名的可信赖问答社区,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。知乎以「让...', 68 'origin': None, 69 'title': '知乎吧_百度贴吧', 70 'type': 'result', 71 'url': 'http://www.baidu.com/link?url=z9s2-lPoEaKn0vmjhD68Wlv5c3KVd8cQgUQjHsxRCHpooJqWzN1q8b4zQ5xGVgF9alZ7iOUncwNWPugIkIzCiK'}, 72 {'des': '在中国,资讯类移动应用的人均阅读时长是 5 分钟,而在知乎日报,这个数字是 ' 73 '21。以独有的方式为你提供最高质、最深度、最有收获的阅读体验。', 74 'origin': 'daily.zhihu.com/', 75 'title': '知乎日报 - 每天 3 次,每次 7 分钟', 76 'type': 'result', 77 'url': 'http://www.baidu.com/link?url=c7zV9crkieLfiq7PG2Rv7smZqzlvhwfQiusrsxqhzy-jQfeyY4YKbdu5OP6i-G_V'}, 78 {'des': '在中国,资讯类移动应用的人均阅读时长是 5 分钟,而在知乎日报,这个数字是 ' 79 '21。以独有的方式为你提供最高质、最深度、最有收获的阅读体验。', 80 'origin': 'baike.baidu.com/', 81 'title': '知乎_百度百科', 82 'type': 'result', 83 'url': 'http://www.baidu.com/link?url=PtXKgIOzT2c03L-TUulJonolOXRM_kWwVg7Y30l5l7KBCNpySkvU4boI-RD9UfHT6P_jw4VNkS3YAvyaMGBh9ktYraUjUwIcbn_xUIQbDJ3'}, 84 {'des': '有问题,上知乎。知乎,可信赖的问答社区,以让每个人高效获得可信赖的解答为使命。知乎凭借认真、专业和友善的社区氛围,结构化、易获得的优质内容,基于问答的内容生产...', 85 'origin': '知乎', 86 'title': '知乎专栏 - 随心写作,自由表达 -知乎', 87 'type': 'result', 88 'url': 'http://www.baidu.com/link?url=HEXG9USqz4D1rmmz9GbZFOnM0hEfN5uKHOflm-ycO_Tz894fzoboV5KjVFZihDIH'}, 89 {'des': '知乎,知乎官方微博。知乎的微博主页、个人资料、相册。新浪微博,随时随地分享身边的新鲜事儿。', 90 'origin': '微博', 91 'title': '知乎的微博_微博', 92 'type': 'result', 93 'url': 'http://www.baidu.com/link?url=kkuiY-8b7vt3-_zgs50cZi1IVQbmYRB_M85gfeaAZpTxGkEix14xJxGuMQxVdOwM'}, 94 {'des': '中国最领先的中文搜索引擎,支持微信公众号、文章搜索,通过独有的SogouRank技术及人工智能算法为您提供最快、最准、最全的搜索服务。', 95 'origin': 'zhihu.sogou.com/', 96 'title': '搜狗搜索引擎 - 上网从搜狗开始', 97 'type': 'result', 98 'url': 'http://www.baidu.com/link?url=ECdFBQXRvJjYdK5zIAmah67cxI5DjcgestjfYmHS1LwTdHvPUBnEJ4SeJLNLVHD0'}], 99 'total': 10} 100\``` 101对比一下百度搜索的页面: 102 103 104仅是网页搜索,爬虫就包括了相关新闻、相关搜索、总计搜索结果数,还有没有体现出来的相关视频、运算等。最最重要的是,也是我做这个爬虫的目的就是……没!有!广!告!比如说,百度搜索Python: 105 106 107前5个全是广告。。。再看看爬虫的: 108\```python 109{'results': [{'result': 76500000, 'type': 'total'}, 110 {'results': ['python有什么用', 111 'python为什么叫爬虫', 112 'python教程', 113 'python爬虫教程', 114 'Python官网', 115 'Python软件', 116 'Python怎么读', 117 'Python安装', 118 'python怎么用'], 119 'type': 'related'}, 120 {'results': [{'author': '新浪', 121 'time': '1小时前', 122 'title': '云计算开发学习笔记:Python3字典键特性和字典内置函数'}, 123 {'author': '艾瑞网', 124 'time': '18小时前', 125 'title': '开课吧Python课程亮相胡海泉抖音直播间'}, 126 {'author': '产经新闻', 127 'time': '21小时前', 128 'title': '风变编程:花时间学Python,是对自己未来最好的投资'}, 129 {'author': '杨数Tos', 130 'time': '2小时前', 131 'title': '前言:Python进阶知识,这个阶段讲什么?'}, 132 {'author': '腾讯新闻', 133 'time': '1天前', 134 'title': '好程序员Python培训分享numpy简介'}], 135 'type': 'news'}, 136 {'results': [{'cover': 'https://vdposter.bdstatic.com/5ecdac23471e6248259e256427ea66c3.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100', 137 'length': '05:41', 138 'origin': '好看视频', 139 'title': 'python在excel中神运用,亮瞎眼的操作哦', 140 'url': 'https://baijiahao.baidu.com/s?id=1659418735845772463&wfr=content'}, 141 {'cover': 'https://vdposter.bdstatic.com/9d0d3890feb5b67504d6c3060b27f1f4.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100', 142 'length': '05:27', 143 'origin': 'B站', 144 'title': 'Python编程语言零基础入门', 145 'url': 'https://www.bilibili.com/video/av77369158'}, 146 {'cover': 'https://dss0.bdstatic.com/9bA1vGfa2gU2pMbfm9GUKT-w/timg?wisealaddin&sec=1594959940&di=8a7a7eb009d265c12debebeaee091bb1&quality=100&size=f242_182&src=http%3A%2F%2Ft12.baidu.com%2Fit%2Fu%3D1372626644%2C933666995%26fm%3D171%26app%3D20%26f%3DPNG%3Fw%3D960%26h%3D540%26s%3DB23751841FBF88C81807A40B0300E0C8', 147 'length': '02:45', 148 'origin': '电子发烧友', 149 'title': 'python为什么叫爬虫', 150 'url': 'http://m.elecfans.com/article/840872.html'}, 151 {'cover': 'https://vdposter.bdstatic.com/d5ea45022429cd32ee4dfdc57f207115.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100', 152 'length': '13:00', 153 'origin': '腾讯视频', 154 'title': 'python入门教程', 155 'url': 'http://v.qq.com/x/page/k0904sgwc3m.html'}, 156 {'cover': 'https://vdposter.bdstatic.com/4bef97469e7bea3220881d74ad9ef1cd.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100', 157 'length': '14:19', 158 'origin': '好看视频', 159 'title': 'python快速开始 1.python简介安装快速开始', 160 'url': 'https://baijiahao.baidu.com/s?id=1652076992836734410&wfr=content'}, 161 {'cover': 'https://vdposter.bdstatic.com/a5e19a532bed1e18e06a83c5e4fa15d7.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100', 162 'length': '23:34', 163 'origin': 'B站', 164 'title': '【Python系列教程】Python开发基础入门 | 零基础小白入门', 165 'url': 'http://www.bilibili.com/video/av78615710'}, 166 {'cover': 'https://vdposter.bdstatic.com/b2e9c4518e21ffe213fe6a7ed5411315.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100', 167 'length': '14:24', 168 'origin': '好看视频', 169 'title': '1.python简介 1.python简介', 170 'url': 'https://baijiahao.baidu.com/s?id=1658873889784272303&wfr=content'}, 171 {'cover': 'https://vdgif.bdstatic.com//de93fa349ded286dedb95d82723eabe0?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100', 172 'length': '01:40:33', 173 'origin': 'B站', 174 'title': '一节课入门Python函数', 175 'url': 'http://www.bilibili.com/video/av63129506'}], 176 'type': 'video'}, 177 {'des': 'The official home of thePythonProgramming Language... ' 178 '#Python3: Simple output (with Unicode) >>> print("Hello, ' 179 'I\'mPython!") Hello, I\'mPython!', 180 'origin': 'www.python.org/', 181 'title': 'Welcome toPython.org', 182 'type': 'result', 183 'url': 'http://www.baidu.com/link?url=scHbokjqF7nK8kca00Pxriw_9kWr_EE5r9a1c7Os_7rP1TZMd6m8lh7VngL7pN6y'}, 184 {'des': 'The official home of thePythonProgramming Language... ' 185 '#Python3: Simple output (with Unicode) >>> print("Hello, ' 186 'I\'mPython!") Hello, I\'mPython!', 187 'origin': 'baike.baidu.com/', 188 'title': 'Python(计算机程序设计语言)_百度百科', 189 'type': 'result', 190 'url': 'http://www.baidu.com/link?url=AuJqASZZgftvzoz9WtXykdoc0CkPRzdqZnQHnwlCAgjYnKpKg6N7OXmj6ALeq1lskvsDrDpFSYMJ_Qb9JcF8eK'}, 191 {'des': '2020年1月1日-Python基础教程Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由 ' 192 'Guido van Rossum 于 1989 年底发明,第一个公开发行版...', 193 'origin': 'www.runoob.com/python/python-t...', 194 'title': 'Python基础教程 | 菜鸟教程', 195 'type': 'result', 196 'url': 'http://www.baidu.com/link?url=AS6_OlV_c6RPIFhNBwEmqQ5yZdk4cx1N6QexFTtvzXc5QsKrOGlvztKrKJSc2jJq2JblBZY400MrgwPcMpE6pa'}, 197 {'des': 'The official home of thePythonProgramming ' 198 'Language...Python3.7.8 June 27, 2020 Download Release ' 199 'NotesPython3.6.11 June 27, 2020 Download Release...', 200 'origin': 'www.python.org/getit/', 201 'title': 'python官网 - DownloadPython|Python.org', 202 'type': 'result', 203 'url': 'http://www.baidu.com/link?url=J2UqeqY52OL-3_bD0fA3c26fzz9hfzAfN6chGEv8DAAq4ReMhYkamJMbMudIIIaM'}, 204 {'des': '2019年3月28日-发现很多人都在学习Python,但是没有明确的说明可以做什么,主流的功能是什么?想知道目前利用Python…', 205 'origin': '知乎', 206 'title': '你都用Python来做什么? - 知乎', 207 'type': 'result', 208 'url': 'http://www.baidu.com/link?url=SClxEbnAtBxfpn9YNtzUI2rbaKLHlSEb4XGXK2hQed6fPcgfwhOillR0ZhBvC2iokdUf_0Z3bdxLZkKd4YCwTK'}, 209 {'des': '跟薯条老师一起学Python,无需任何编程基础。网站提供高质量的在线教程:Python, C++, Java, ' 210 'Golang,数据结构与算法,大数据分析,人工智能。小班授课,Python技术专家...', 211 'origin': 'www.chipscoco.com/', 212 'title': 'Python-薯条编程-在线教程-小班授课高薪就业培训', 213 'type': 'result', 214 'url': 'http://www.baidu.com/link?url=h3KN1tX9UxPXEjXoZpGTOADtvji3dsdzAqewRGEY830t1wR6FHnho8Xz5PCqVm-3'}, 215 {'des': '2019年2月26日-Python简介Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语言经常使用英文关...', 216 'origin': 'www.runoob.com/python/python-i...', 217 'title': 'Python简介 | 菜鸟教程', 218 'type': 'result', 219 'url': 'http://www.baidu.com/link?url=SDpcHxtGw2KljoYxAqHFeERwpDoleC_f3e2OxIp-9ZWcKfIyBe8LOLAL1-pu5OpdbAhU-T79X-Dg431TLq_hpK'}, 220 {'des': '这套Python基础教程通俗易懂,深入浅出,旨在帮助大家快速入门。这套Python教程虽然学习门槛低,但是知识体系很丰富,并且包含了大量实例,让大家学以致用。', 221 'origin': 'c.biancheng.net/python', 222 'title': 'Python基础教程,Python入门教程(非常详细)_C语言中文网', 223 'type': 'result', 224 'url': 'http://www.baidu.com/link?url=OfI9KuyJqrx5_QWQQFVN7Rmk7e7INjkVfcvqLFEbbos90UZ2xaxfQXEHoTX_IQpZ'}], 225 'total': 10} 226\``` 227没有广告诶!! 228 229目前文档还在撰写中,地址在[这里](https://link.zhihu.com/?target=https%3A//baiduspider.github.io/),GitHub的地址在[这里](https://link.zhihu.com/?target=https%3A//github.com/BaiduSpider/BaiduSpider),欢迎star和fork!如果有错误或问题,欢迎到GitHub发布issue!
总结
ZhihuToMarkdown这个项目还有许许多多的不足,也十分欢迎你来参与这个项目的维护!
好啦,今天就先记录到这里,最后再献上我的GitHub仓库,欢迎star和fork哦: ZhihuToMarkdown
最后,不点个赞再走嘛~
