Python爬虫之Js逆向案例(12)-知乎答案批量获取保存到CSV文件
声明:知乎答案批量获取分析仅用于研究和学习,如有侵权,可联系删除
大家好,本期分享的内容是一个关于批量获取知乎答案的案例,本案例的重点是教大家在写爬虫时如何更规范的去编写自己的爬虫。场景是这样的,最近在帮一位同学排查几个爬虫问题,于是乎我三生有幸看到了这位工作几年的老哥写的爬虫代码,中间过程我就省略了,一句话总结就是:写的代码很好,下次不许再写了!!!至少以后别再让我给你排查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例,不想自己造轮子的同学可加入我的知识星球,有更多技巧、案例注意事项、案例坑点终结、答疑提问特权等你哦!!!
欢迎加入「python、爬虫、逆向Club」知识星球
Python爬虫之Js逆向案例(12)-知乎答案批量获取保存到CSV文件相关推荐
- Python爬虫之Js逆向案例(2)-某乎搜索
Python爬虫之Js逆向案例(2)-知乎搜索 声明:某乎加密逆向分析仅用于研究和学习 大家好,今天继续分享关于某乎关键词搜索接口为案例的Js逆向实战.如果你是一名新手,而且还没有来得及看上一篇< ...
- Python爬虫之Js逆向案例(8)-某乎x-zst-81之webpack
声明:某乎加密逆向分析仅用于研究和学习,如有侵权,可联系删除 大家好,相信各位童鞋通过上期<Python爬虫之Js逆向案例(7)-知hu最新x-zse-96之rpc方案>这篇文章了解了什么 ...
- Python爬虫之Js逆向案例(6)-某道翻译
Python爬虫之Js逆向案例(6)-有道翻译 声明:某道翻译加密逆向分析仅用于研究和学习,如有侵权,可联系删除 大家好,距离上次分享js逆向案例已经有一个月了,在这期间每次在快要揭秘出来时.整理文章 ...
- Python爬虫:利用JS逆向抓取携程网景点评论区图片的下载链接
Python爬虫:利用JS逆向抓取携程网景点评论区图片的下载链接 1. 前言 2. 实现过程 3. 运行结果 1. 前言 文章内容可能存在版权问题,为此,小编不提供相关实现代码,只是从js逆向说一说到 ...
- Python爬虫入门之2022软科中国大学排名爬取保存到csv文件
一.实验方案设计 1.获得"2022软科中国大学排名"数据,从[软科排名]2022年最新软科中国大学排名|中国最好大学排名网页中获得排名数据信息,并将数据保存到csv文件中. 2. ...
- 【python爬虫】js逆向:空气质量在线平台,解决反调试,加密
js逆向:pyhon爬虫空气质量,无线debugger,AES,DES,MD5加密 前言 解决无限debugger 第一次debugger 第二次debugger 加密解密流程分析 请求数据加密 返回 ...
- Python爬虫:从js逆向了解西瓜视频的下载链接的生成
前言 最近花费了几天时间,想获取西瓜视频这个平台上某个视频的下载链接,运用js逆向进行获取.其实,如果小编一开始就注意到这一点(就是在做js逆向时,打了断点之后,然后执行相关代码,查看相关变量的值,结 ...
- python爬虫进阶js逆向实战 | 爬取 破解某安部加速乐cookie
很久没有写技术性的文章了,最近打算更新一系列的js逆向实战 今天的网站是某安部的一个加密cookie的分析跟破解 aHR0cHM6Ly93d3cubXBzLmdvdi5jbi9uMjI1NDA5OC9 ...
- python作业之生成儿童谜语题试卷及答案(需搭配儿童谜语.csv文件使用)
python作业之生成谜题试卷及答案 原题目为: 一年级要举行一个猜谜比赛,需要从儿童谜语集中随机抽题组成5份试卷.已知谜语集存储在"儿童谜语集csv"的文件中.现要求每一份试卷中 ...
最新文章
- CSS设置透明边框解决浏览器兼容性问题
- spark streaming 接收 kafka 数据java代码WordCount示例
- 用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中
- oracle rman异地备份,Rman 异地备份 - markGao的个人空间 - OSCHINA - 中文开源技术交流社区...
- 基于迁移学习的反欺诈方法研究
- 构造方法和方法的重载。
- elxel表格纸张尺寸_纸张知识|克重厚薄多少,正度大度纸开本尺寸规格是什么大小,和A4有啥区别?...
- HDU - 5573 Binary Tree(思维+构造+二进制)
- wpa_supplicant wifi密码错误检测
- mysql skip-opt_FAQ系列 | mysqldump选项之skip-opt-阿里云开发者社区
- python与excel-Python 与 Excel 终于在一起了
- vue框架导入echarts第一个示例
- Struts配置文件的加载顺序
- html5设计基础报告,《网页设计与制作基础》实验报告.doc
- knockoutjs的某些坑总结
- 计算机指纹驱动程序,计算机指纹失灵,提示找不到支持Windows Hello指纹的指纹识别器...
- 神经网络 知识图谱,神经网络基础知识
- 关务+物流领域的技术发展路线
- 历史上的9月 | Mix时光机
- 【开发环境】 Ubuntu14.04 安装Skyeye 1.3.5过程