声明:知乎答案批量获取分析仅用于研究和学习,如有侵权,可联系删除
大家好,本期分享的内容是一个关于批量获取知乎答案的案例,本案例的重点是教大家在写爬虫时如何更规范的去编写自己的爬虫。场景是这样的,最近在帮一位同学排查几个爬虫问题,于是乎我三生有幸看到了这位工作几年的老哥写的爬虫代码,中间过程我就省略了,一句话总结就是:写的代码很好,下次不许再写了!!!至少以后别再让我给你排查bug
了、、、那个痛苦的过程,给你排查bug
差点让我改行、、、;所以本次用批量爬取知乎问题的答案为案例来简单介绍一下我是如何编写一个爬虫的,以至于让我排查问题时如此高效!!!
为了照顾刚入门童鞋,文章每一步的分析过程尽可能的详细(有经验的同学可以选择感兴趣的地方快速浏览)
下面会进行以下几步进行分析(下方演示过程全部使用chrome
浏览器);
如何编写爬虫项目?
这个问题可能有很多新入门的小伙伴并没有过多在意过,大多时候大家的爬虫可能很简单,一个py文件100行
以内就搞定了,久而久之,工作几年之后养成了一些规范上的习惯,导致后续工作中、或者demo中一旦遇到稍微复杂一点的项目,很多问题就暴露出来了,例如:
- 项目的组织结构;
- 函数、变量的命名规范;
- 模块化设计
上面这几个问题大家可以自己问一下自己,平时写爬虫的时候有没有注意过这些呢?
所以上次再给那位同学排查问题时,本身问题是个很小的问题,由于他项目组织规范、编码规范问题导致排查问题的成本变得很高、、、;一下通过案例来介绍我的方法!
案例需求:给定一个存放问题链接的csv文件,需要读取文件中的问题链接(每个问题一行,链接数0-n),获取每个问题的答案,并按要求字段保存到csv文件中?
问题链接示例:https://www.zhihu.com/question/561292920/answers/updated
一.分析页面内容
经过定位,发现问题的答案接口是:https://www.zhihu.com/api/v4/questions/561292920/feeds?xxxxxxx
;这个接口,但是我们发现打开页面时并没有请求这个接口,那数据是怎么来的呢?
经过分析,首页的内容并不直接来自feed
接口,服务器在返回时似乎已经把这个页面组装完成了,如下图:
我们知道,现在web前端开发确实有这种成熟的技术叫服务端渲染,简称SSR
,还有其他渲染方式CSR
等等。
我们经过调试,我们发现只有从第二页开始,才会调用feed的接口,滑动页面,触发下一页加载,如下图:
有的小伙伴可能会说了,那我不要第一页的数据了,我直接从第二页开始爬答案不就行了吗?这样说似乎也没问题,我试了,也可以获取到答案;
二.解析首页数据
这个答案的获取规则是这样的,想获取下一页数据,你必须要带上上一页最后一个回答的cursor
和session_id
,如何不从第一页开始拿数据,你获取数据时每切换一个问题,你就要重新手动到浏览器上拷贝上面的两个值,是不是很累?我们案例要求是有0-n
个问题链接的,这样每次拷贝效率也太低了,于是最好的办法还是需要从第一页开始,现在问题就是解析第一页的数据;由于第一个的数据跟第二页之后的不一样,所以我是这样做的:
新建一个类,名字叫HtmlTool.py
,作用就是专门来请求问题链接,从HTML
文件中解析出首页的数据,并将数据组装成feed
的接口返回的格式,如下图:
这样写其实也没问题,但是请求头headers
、cookies
放在这个文件中感觉不是很优雅,为了使页面里的内容更加注重业务逻辑,我们把配置性的文件提取到配置文件中,让这个文件更简洁不是更好吗?于是我们提把配置性的内容都放在config.yaml
中,如下图:
上面解析首页数据的工具类就完成了;
三.保存数据到CSV文件
还一个模块似乎也很独立,那就是保存数据到csv
文件中,功能单一,所以也放到一个单独的工具类里,新建文件名AnsersTool.py
,如下图:
保存文件功能比较简单,函数接收以list
数据,保存即可,这个类只负责保存,其它事物一概不管,所以维护起来页比较容易;这样是不是模块化比较明显了?
四.爬虫入口文件
爬虫启动文件是__init__.py
,主要负责组织各个模块相互协助,已完成总体业务,如下图:
入口
if __name__ == '__main__':
# 参数是每个问题最大请求页数,有的问题可能很多答案,如果不限定,一个问题的答案可能爬很久
get_fetch(config['max_page'])
这里提取了一个配置参数,控制每个问题最大页数,比如测试时我们只想请求前2页
的数据看效果即可,这个就可以配置成2
;
五.整体
还有一点就是代码中最好是把每一步的日志打出来,例如下面这样,如果其中一步出问题了也可以通过日志信息快速排查到问题,如下图:
最终导出结果:
后期会持续分享爬虫案例-100例,不想自己造轮子的同学可加入我的知识星球,有更多技巧、案例注意事项、案例坑点终结、答疑提问特权等你哦!!!