20170609 更新:
感谢一介草民与 ftzz 的反馈
(1) 修复中文路径保存问题
(2) 修复 offset 问题
(3) 修复第一个问题
来个好玩的东西
20170607 更新:
(1) 感谢 Ftzz 提醒, 将图片替换为原图
(2) 将文件保存到本地,解决了最大的缺点问题,不用联网也可以看了
大家好,我是四毛。 写在前面的话 在开始前,给大家分享一个前段时间逛 Github 时看到的某个爬虫脚本中的内容: 所以,大家爬网站的时候,还是友善一点为好,且爬且珍惜啊。 好了,言归正传。 今天主要讲一下如何将某一个知乎问题的所有答案转换为本地 MarkDown 文件。
前期准备
python2.7 html2text markdownpad(这里随意,只要可以支持 md 就行) 会抓包。。。。。 最重要的是你要有代理,因为知乎开始封 IP 了
1.什么是 MarkDown 文件
Markdown 是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版,而不像一般我们用的字处理软件 Word 或 Pages 有大量的排版、字体设置。它使我们专心于码字,用「标记」语法,来代替常见的排版格式。例如此文从内容到格式,甚至插图,键盘就可以通通搞定了。 恩,上面是我抄的,哈哈。想多了解的可以看看这里。
2.为什么要将答案转为 MarkDwon
因为。。。。。。懒,哈哈,开个玩笑。最重要的原因还是 markdown 看着比较舒服。平时写脚本的时候,也一直在思考一个问题,如何将一个文字与图片穿插的网页原始的保存下来呢。如果借助工具的话,那就很多了,CTRL+P 打印的时候,选择另存为 PDF,或者搞个印象笔记,直接保存整个网页。那么,我们如何用爬虫实现呢?正好前几天看到了这个项目,仔细研究了一下,大受启发。
3.原理
原理说起来很简单:获取请求到的内容的 BODY 部分,然后重新构建一个 HTML 文件,接着利用 html2text 这个模块将其转换为 markdown 文件,最后对图片及标题按照 markdown 的格式做一些处理就好了。目前应用的场景主要是在知乎。
4.Show Code
4.1 获取知乎答案
写代码的时候,主要考虑了两种使用场景。第一,获取某一特定答案的数据然后进行转换;第二,获取某一个问题的所有答案进行然后挨个进行转换,在这里可以 通过赞同数来对要获取的答案进行质量控制。 4.1.1、某一个特定答案的数据获取
url:https://www.zhihu.com/question/27621722/answer/48658220(前面那个是问题ID,后边的是答案ID)
这一数据的获取我这里分为了两个部分,第一部分请求上述网址,拿到答案主体数据以及赞同数,第二部分请求下面这个接口:
为什么会这样?因为这个接口得到的答案正文数据不是完整数据,所以只能分两步了。 4.1.2、某一个特定答案的数据获取 这一个数据就可以通过很简单的方式得到了,接口如下:
返回的都是 JSON 数据,很方便获取。但是这里有一个地方需要注意,从这里面取的答案正文数据就是文本数据,不是一个完整的 html 文件,所以需要在构造一下。 4.1.2、保存的字段
author_name 回答用户名 answer_id 答案 ID question_id 问题 ID question_title 问题 vote_up_count 赞同数 create_time 创建时间 答案主体
4.2 Code
主脚本:zhihu.py
1 |
#!/usr/bin/env python |
zhihu.py 为主脚本,内容很简单,发起请求,调用解析函数进行解析,最后再进行保存。 解析函数脚本:parse_content.py
1 |
#!/usr/bin/env python |
parse_content.py 主要负责构造新的 html,然后对其进行解析,获取数据。
5.测试结果展示
6.缺点与不足
下面聊一聊这种方法的缺点: 这种方法的最大缺点就是:
一定要联网!
一定要联网!
一定要联网!
因为。。。。。。 在 md 文件中我们只是写了个图片的网址,这就意味着 markdown 的编辑器帮我们去存放图片的服务器上对这个图片进行了获取,所以断网也就意味着你看不到图片了;同时也意味着如果用户删除了这张图片,你也就看不到了。 但是,后来我又发现在 markdownpad 中将文件导出为 html 时,即使是断网了,依然可以看到全部的内容,包括图片,所以如果你真的喜欢某一个答案,保存到印象笔记肯定是不错的选择,PDF 直接保存也不错,如果是使用了这个方法,记得转为 html 最好。 还有一个缺点就是 html2text 转换过后的效果其实并不是特别好,还是需要后期在进行处理的。
7.总结
代码还有很多可以改进之处,欢迎大家与我交流:QQ:549411552 (注明来自静觅) 国际惯例:代码在这 收工。