好吧,让我们从头说起。
众所不周知,我有了我自己的博客,于是就想把我的知乎内容同步到博客上去(目前还空空如也)。但是,出于能犯懒就犯懒的原则,我决定做一个自动化程序,自动将知乎上的文章转换成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,说了这么多别人的库不好,我给大家看一看我的转换器转换出来的效果吧(文章使用的是这篇):
# 番外篇:爬取百度
[知乎视频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有网页版啦!想尝鲜的童鞋们请在下面的链接里体验(因为服务器在国外,所有会有点慢,请谅解)
[BaiduSpiderbaiduspider.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
最后,不点个赞再走嘛~