知乎文章转Markdown的艰辛历程

samzhangjy
• 阅读 3012

好吧,让我们从头说起。

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

万恶之源

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

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

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

坎坷的解析

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

效果展示

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

# 番外篇:爬取百度

[知乎视频​www.zhihu.com](https://www.zhihu.com/zvideo/1272864710321516544)

更新20201003:

BaiduSpider已经从原有的samzhangjy/BaiduSpider移至了BaiduSpider/BaiduSpider啦!

更新20200801:

BaiduSpider有CLI啦!想体验的可以自行阅读README:
[https://github.com/BaiduSpider/BaiduSpider/tree/master/baiduspider/cli](https://link.zhihu.com/?target=https%3A//github.com/BaiduSpider/BaiduSpider/tree/master/baiduspider/cli)

更新20200724:

BaiduSpider有网页版啦!想尝鲜的童鞋们请在下面的链接里体验(因为服务器在国外,所有会有点慢,请谅解) 
[BaiduSpider​baiduspider.now.sh](https://link.zhihu.com/?target=https%3A//baiduspider.now.sh)
***
这两天在弄爬虫,没有弄Flask,就整了一个百度爬虫自己玩。做着做着就上瘾了,想着就开源了吧,于是就把代码放到了
[GitHub上](https://link.zhihu.com/?target=https%3A//github.com/BaiduSpider/BaiduSpider)
。目前实现的功能有百度网页搜索,百度图片搜索,百度知道搜索,百度视频搜索,百度资讯搜索,百度文库搜索,百度经验搜索和百度百科搜索。

演示一下百度网页搜索的返回值(是第一页,可以自定义爬取的页码):
```python
{'results': [{'result': 75100000, 'type': 'total'},
             {'results': ['知乎官网入口',
                          '知乎网首页',
                          '知乎这个软件是干嘛用的',
                          '知乎为什么被叫做b乎',
                          '知乎手机网页版',
                          '知乎官网登首页',
                          '知乎搜索入口',
                          '知乎app下载安装',
                          '知乎上都是一群什么人'],
              'type': 'related'},
             {'results': [{'author': '腾讯新闻',
                           'time': '22小时前',
                           'title': '影院停摆之际,知乎加码影视宣发'},
                          {'author': '砍柴网',
                           'time': '1天前',
                           'title': '知乎CTO李大海:谢邀,来分享下内容社区的AI架构搭建...'},
                          {'author': '刺猬公社',
                           'time': '53分钟前',
                           'title': '“国家队”在知乎破圈'},
                          {'author': '央广网',
                           'time': '2天前',
                           'title': '“我们的太空”知乎关注破百万 周源受聘“航天文化...'},
                          {'author': '网易',
                           'time': '1天前',
                           'title': '知乎扎心高赞:30岁还没有走到管理岗的人,后来怎么样...'}],
              'type': 'news'},
             {'des': '有问题,上知乎。知乎,可信赖的问答社区,以让每个人高效获得可信赖的解答为使命。知乎凭借认真、专业和友善的社区氛围,结构化、易获得的优质内容,基于问答的内容生产...',
              'origin': '知乎',
              'title': '知乎- 有问题,上知乎',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=BRjVvTl__HWSymJmMuILwwm1bdP5t9O7pGhx5mVyTcO'},
             {'des': '有问题,上知乎。知乎,可信赖的问答社区,以让每个人高效获得可信赖的解答为使命。知乎凭借认真、专业和友善的社区氛围,结构化、易获得的优质内容,基于问答的内容生产...',
              'origin': '知乎',
              'title': '发现-知乎',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=M6JrlssNmgrADeSZnReZ-I6ipIxBTmZG-CqNr6oan34Q6yUY0DiEHsOYcWATBG0Q'},
             {'des': '知乎是中文互联网知名的可信赖问答社区,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。知乎以「让...',
              'origin': '知乎',
              'title': '知乎-知乎',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=LNpiNwKAO-6HtjBgJ4mXCN7hzGbDn_RHPsmKt2qbXW6EwcHd3VGNQrG-KZSkpLaP'},
             {'des': '知乎是中文互联网知名的可信赖问答社区,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。知乎以「让...',
              'origin': None,
              'title': '知乎吧_百度贴吧',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=z9s2-lPoEaKn0vmjhD68Wlv5c3KVd8cQgUQjHsxRCHpooJqWzN1q8b4zQ5xGVgF9alZ7iOUncwNWPugIkIzCiK'},
             {'des': '在中国,资讯类移动应用的人均阅读时长是 5 分钟,而在知乎日报,这个数字是 '
                     '21。以独有的方式为你提供最高质、最深度、最有收获的阅读体验。',
              'origin': 'daily.zhihu.com/',
              'title': '知乎日报 - 每天 3 次,每次 7 分钟',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=c7zV9crkieLfiq7PG2Rv7smZqzlvhwfQiusrsxqhzy-jQfeyY4YKbdu5OP6i-G_V'},
             {'des': '在中国,资讯类移动应用的人均阅读时长是 5 分钟,而在知乎日报,这个数字是 '
                     '21。以独有的方式为你提供最高质、最深度、最有收获的阅读体验。',
              'origin': 'baike.baidu.com/',
              'title': '知乎_百度百科',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=PtXKgIOzT2c03L-TUulJonolOXRM_kWwVg7Y30l5l7KBCNpySkvU4boI-RD9UfHT6P_jw4VNkS3YAvyaMGBh9ktYraUjUwIcbn_xUIQbDJ3'},
             {'des': '有问题,上知乎。知乎,可信赖的问答社区,以让每个人高效获得可信赖的解答为使命。知乎凭借认真、专业和友善的社区氛围,结构化、易获得的优质内容,基于问答的内容生产...',
              'origin': '知乎',
              'title': '知乎专栏 - 随心写作,自由表达 -知乎',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=HEXG9USqz4D1rmmz9GbZFOnM0hEfN5uKHOflm-ycO_Tz894fzoboV5KjVFZihDIH'},
             {'des': '知乎,知乎官方微博。知乎的微博主页、个人资料、相册。新浪微博,随时随地分享身边的新鲜事儿。',
              'origin': '微博',
              'title': '知乎的微博_微博',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=kkuiY-8b7vt3-_zgs50cZi1IVQbmYRB_M85gfeaAZpTxGkEix14xJxGuMQxVdOwM'},
             {'des': '中国最领先的中文搜索引擎,支持微信公众号、文章搜索,通过独有的SogouRank技术及人工智能算法为您提供最快、最准、最全的搜索服务。',
              'origin': 'zhihu.sogou.com/',
              'title': '搜狗搜索引擎 - 上网从搜狗开始',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=ECdFBQXRvJjYdK5zIAmah67cxI5DjcgestjfYmHS1LwTdHvPUBnEJ4SeJLNLVHD0'}],
 'total': 10}
\```
对比一下百度搜索的页面:
![https://img-hello-world.oss-cn-beijing.aliyuncs.com/130fb458071edac4097fad230e05cbcc.jpeg](https://pic3.zhimg.com/v2-97fee8255552363a0f2c728946fd5006_r.jpg)

仅是网页搜索,爬虫就包括了相关新闻、相关搜索、总计搜索结果数,还有没有体现出来的相关视频、运算等。最最重要的是,也是我做这个爬虫的目的就是……没!有!广!告!比如说,百度搜索Python:
![https://img-hello-world.oss-cn-beijing.aliyuncs.com/6fb33cada287b647a0589dd686ba26b7.png](https://pic3.zhimg.com/v2-fb4e0064cd8a4c8e26272e93cf175d2e_r.jpg)

前5个全是广告。。。再看看爬虫的:
\```python
{'results': [{'result': 76500000, 'type': 'total'},
             {'results': ['python有什么用',
                          'python为什么叫爬虫',
                          'python教程',
                          'python爬虫教程',
                          'Python官网',
                          'Python软件',
                          'Python怎么读',
                          'Python安装',
                          'python怎么用'],
              'type': 'related'},
             {'results': [{'author': '新浪',
                           'time': '1小时前',
                           'title': '云计算开发学习笔记:Python3字典键特性和字典内置函数'},
                          {'author': '艾瑞网',
                           'time': '18小时前',
                           'title': '开课吧Python课程亮相胡海泉抖音直播间'},
                          {'author': '产经新闻',
                           'time': '21小时前',
                           'title': '风变编程:花时间学Python,是对自己未来最好的投资'},
                          {'author': '杨数Tos',
                           'time': '2小时前',
                           'title': '前言:Python进阶知识,这个阶段讲什么?'},
                          {'author': '腾讯新闻',
                           'time': '1天前',
                           'title': '好程序员Python培训分享numpy简介'}],
              'type': 'news'},
             {'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',
                           'length': '05:41',
                           'origin': '好看视频',
                           'title': 'python在excel中神运用,亮瞎眼的操作哦',
                           'url': 'https://baijiahao.baidu.com/s?id=1659418735845772463&wfr=content'},
                          {'cover': 'https://vdposter.bdstatic.com/9d0d3890feb5b67504d6c3060b27f1f4.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100',
                           'length': '05:27',
                           'origin': 'B站',
                           'title': 'Python编程语言零基础入门',
                           'url': 'https://www.bilibili.com/video/av77369158'},
                          {'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',
                           'length': '02:45',
                           'origin': '电子发烧友',
                           'title': 'python为什么叫爬虫',
                           'url': 'http://m.elecfans.com/article/840872.html'},
                          {'cover': 'https://vdposter.bdstatic.com/d5ea45022429cd32ee4dfdc57f207115.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100',
                           'length': '13:00',
                           'origin': '腾讯视频',
                           'title': 'python入门教程',
                           'url': 'http://v.qq.com/x/page/k0904sgwc3m.html'},
                          {'cover': 'https://vdposter.bdstatic.com/4bef97469e7bea3220881d74ad9ef1cd.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100',
                           'length': '14:19',
                           'origin': '好看视频',
                           'title': 'python快速开始 1.python简介安装快速开始',
                           'url': 'https://baijiahao.baidu.com/s?id=1652076992836734410&wfr=content'},
                          {'cover': 'https://vdposter.bdstatic.com/a5e19a532bed1e18e06a83c5e4fa15d7.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100',
                           'length': '23:34',
                           'origin': 'B站',
                           'title': '【Python系列教程】Python开发基础入门 | 零基础小白入门',
                           'url': 'http://www.bilibili.com/video/av78615710'},
                          {'cover': 'https://vdposter.bdstatic.com/b2e9c4518e21ffe213fe6a7ed5411315.jpeg?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100',
                           'length': '14:24',
                           'origin': '好看视频',
                           'title': '1.python简介 1.python简介',
                           'url': 'https://baijiahao.baidu.com/s?id=1658873889784272303&wfr=content'},
                          {'cover': 'https://vdgif.bdstatic.com//de93fa349ded286dedb95d82723eabe0?x-bce-process=image/resize,m_fill,w_242,h_182/format,f_jpg/quality,Q_100',
                           'length': '01:40:33',
                           'origin': 'B站',
                           'title': '一节课入门Python函数',
                           'url': 'http://www.bilibili.com/video/av63129506'}],
              'type': 'video'},
             {'des': 'The official home of thePythonProgramming Language... '
                     '#Python3: Simple output (with Unicode) >>> print("Hello, '
                     'I\'mPython!") Hello, I\'mPython!',
              'origin': 'www.python.org/',
              'title': 'Welcome toPython.org',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=scHbokjqF7nK8kca00Pxriw_9kWr_EE5r9a1c7Os_7rP1TZMd6m8lh7VngL7pN6y'},
             {'des': 'The official home of thePythonProgramming Language... '
                     '#Python3: Simple output (with Unicode) >>> print("Hello, '
                     'I\'mPython!") Hello, I\'mPython!',
              'origin': 'baike.baidu.com/',
              'title': 'Python(计算机程序设计语言)_百度百科',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=AuJqASZZgftvzoz9WtXykdoc0CkPRzdqZnQHnwlCAgjYnKpKg6N7OXmj6ALeq1lskvsDrDpFSYMJ_Qb9JcF8eK'},
             {'des': '2020年1月1日-Python基础教程Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由 '
                     'Guido van Rossum 于 1989 年底发明,第一个公开发行版...',
              'origin': 'www.runoob.com/python/python-t...',
              'title': 'Python基础教程 | 菜鸟教程',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=AS6_OlV_c6RPIFhNBwEmqQ5yZdk4cx1N6QexFTtvzXc5QsKrOGlvztKrKJSc2jJq2JblBZY400MrgwPcMpE6pa'},
             {'des': 'The official home of thePythonProgramming '
                     'Language...Python3.7.8 June 27, 2020 Download Release '
                     'NotesPython3.6.11 June 27, 2020 Download Release...',
              'origin': 'www.python.org/getit/',
              'title': 'python官网 - DownloadPython|Python.org',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=J2UqeqY52OL-3_bD0fA3c26fzz9hfzAfN6chGEv8DAAq4ReMhYkamJMbMudIIIaM'},
             {'des': '2019年3月28日-发现很多人都在学习Python,但是没有明确的说明可以做什么,主流的功能是什么?想知道目前利用Python…',
              'origin': '知乎',
              'title': '你都用Python来做什么? - 知乎',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=SClxEbnAtBxfpn9YNtzUI2rbaKLHlSEb4XGXK2hQed6fPcgfwhOillR0ZhBvC2iokdUf_0Z3bdxLZkKd4YCwTK'},
             {'des': '跟薯条老师一起学Python,无需任何编程基础。网站提供高质量的在线教程:Python, C++, Java, '
                     'Golang,数据结构与算法,大数据分析,人工智能。小班授课,Python技术专家...',
              'origin': 'www.chipscoco.com/',
              'title': 'Python-薯条编程-在线教程-小班授课高薪就业培训',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=h3KN1tX9UxPXEjXoZpGTOADtvji3dsdzAqewRGEY830t1wR6FHnho8Xz5PCqVm-3'},
             {'des': '2019年2月26日-Python简介Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语言经常使用英文关...',
              'origin': 'www.runoob.com/python/python-i...',
              'title': 'Python简介 | 菜鸟教程',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=SDpcHxtGw2KljoYxAqHFeERwpDoleC_f3e2OxIp-9ZWcKfIyBe8LOLAL1-pu5OpdbAhU-T79X-Dg431TLq_hpK'},
             {'des': '这套Python基础教程通俗易懂,深入浅出,旨在帮助大家快速入门。这套Python教程虽然学习门槛低,但是知识体系很丰富,并且包含了大量实例,让大家学以致用。',
              'origin': 'c.biancheng.net/python',
              'title': 'Python基础教程,Python入门教程(非常详细)_C语言中文网',
              'type': 'result',
              'url': 'http://www.baidu.com/link?url=OfI9KuyJqrx5_QWQQFVN7Rmk7e7INjkVfcvqLFEbbos90UZ2xaxfQXEHoTX_IQpZ'}],
 'total': 10}
\```
没有广告诶!!

目前文档还在撰写中,地址在[这里](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​

最后,不点个赞再走嘛~

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
samzhangjy
samzhangjy
Lv1
Keep coding forever...
文章
3
粉丝
2
获赞
4