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的接口,滑动页面,触发下一页加载,如下图:
在这里插入图片描述
有的小伙伴可能会说了,那我不要第一页的数据了,我直接从第二页开始爬答案不就行了吗?这样说似乎也没问题,我试了,也可以获取到答案;

二.解析首页数据

这个答案的获取规则是这样的,想获取下一页数据,你必须要带上上一页最后一个回答的cursorsession_id,如何不从第一页开始拿数据,你获取数据时每切换一个问题,你就要重新手动到浏览器上拷贝上面的两个值,是不是很累?我们案例要求是有0-n个问题链接的,这样每次拷贝效率也太低了,于是最好的办法还是需要从第一页开始,现在问题就是解析第一页的数据;由于第一个的数据跟第二页之后的不一样,所以我是这样做的:

新建一个类,名字叫HtmlTool.py,作用就是专门来请求问题链接,从HTML文件中解析出首页的数据,并将数据组装成feed的接口返回的格式,如下图:
在这里插入图片描述
在这里插入图片描述

这样写其实也没问题,但是请求头headerscookies放在这个文件中感觉不是很优雅,为了使页面里的内容更加注重业务逻辑,我们把配置性的文件提取到配置文件中,让这个文件更简洁不是更好吗?于是我们提把配置性的内容都放在config.yaml中,如下图:

在这里插入图片描述
上面解析首页数据的工具类就完成了;

三.保存数据到CSV文件

还一个模块似乎也很独立,那就是保存数据到csv文件中,功能单一,所以也放到一个单独的工具类里,新建文件名AnsersTool.py,如下图:
在这里插入图片描述
保存文件功能比较简单,函数接收以list数据,保存即可,这个类只负责保存,其它事物一概不管,所以维护起来页比较容易;这样是不是模块化比较明显了?

四.爬虫入口文件

爬虫启动文件是__init__.py,主要负责组织各个模块相互协助,已完成总体业务,如下图:

在这里插入图片描述
入口

if __name__ == '__main__':
    # 参数是每个问题最大请求页数,有的问题可能很多答案,如果不限定,一个问题的答案可能爬很久
    get_fetch(config['max_page'])

这里提取了一个配置参数,控制每个问题最大页数,比如测试时我们只想请求前2页的数据看效果即可,这个就可以配置成2

五.整体

在这里插入图片描述
还有一点就是代码中最好是把每一步的日志打出来,例如下面这样,如果其中一步出问题了也可以通过日志信息快速排查到问题,如下图:
在这里插入图片描述

最终导出结果:
在这里插入图片描述


后期会持续分享爬虫案例-100例,不想自己造轮子的同学可加入我的知识星球,有更多技巧、案例注意事项、案例坑点终结、答疑提问特权等你哦!!!

欢迎加入「python、爬虫、逆向Club」知识星球

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以为你提供一个简单的 Python 爬虫程序,可以用来浏览乎上的浏览量,并将结果保存CSV 文件中。程序的代码如下:import requests import csv# 定义乎的 API 接口 url = 'https://www.zhihu.com/api/v4/questions/{0}/answers?include=data%5B%2A%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%2Cis_recognized%2Cpaid_info%2Cpaid_info_content%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%2A%5D.topics&limit=5&offset=0&platform=desktop&sort_by=default'# 定义要查询的问题ID question_id = '20552571'# 构建请求 r = requests.get(url.format(question_id))# 获取结果 data = r.json()# 打开 csv 文件,准备写入 f = open('zhihu.csv', 'w', encoding='utf-8') writer = csv.writer(f)# 写入表头 writer.writerow(['title','view_count'])# 遍历结果,将数据写入 csv 文件 for d in data['data']: title = d['question']['title'] view_count = d['question']['view_count'] writer.writerow([title, view_count])# 关闭文件 f.close() ### 回答2: 以下是一个用Python编写的爬虫代码,可以用来浏览乎上问题的浏览量,并将结果保存CSV文件中: ```python import csv import requests from bs4 import BeautifulSoup def get_views(url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0;Win64) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") views = soup.select_one(".NumberBoard-itemValue").get_text().strip() return views def save_to_csv(views_list): with open('zhihu_views.csv', 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(["问题", "浏览量"]) for views in views_list: writer.writerow(views) def main(): urls = [ "https://www.zhihu.com/question/123", "https://www.zhihu.com/question/456", "https://www.zhihu.com/question/789" ] views_list = [] for url in urls: views = get_views(url) views_list.append([url, views]) print(f"问题:{url}\n浏览量:{views}") save_to_csv(views_list) if __name__ == "__main__": main() ``` 以上代码中,我们首先导入了需要使用的库:`csv` 用于处理CSV文件,`requests` 用于发送网络请求,`BeautifulSoup` 用于解析网页内容。然后定义了 `get_views` 函数,用来获取乎问题的浏览量。接着,我们定义了 `save_to_csv` 函数,用来将结果保存CSV文件中。最后,我们在 `main` 函数中定义了要爬取的乎问题的URL列表,并利用之前定义的函数进行爬取和保存。 请注意,为了成功发送请求,我们在 `get_views` 函数中设置了一个伪装的 User-Agent 头部。在 `main` 函数中,你可以根据自己的需求修改 `urls` 列表,将你感兴趣的乎问题的URL添加进去。 ### 回答3: 当然可以!以下是一个简单的Python爬虫代码示例,用于浏览乎的浏览量并将结果保存CSV文件中: ```python import requests import csv def get_zhihu_views(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' } response = requests.get(url, headers=headers) data = response.json() # 获取乎页面的json数据 # 解析json数据获取浏览量 views = data['paging']['totals'] return views def save_to_csv(views): with open('zhihu_views.csv', 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['浏览量']) writer.writerow([views]) if __name__ == "__main__": zhihu_url = 'https://www.zhihu.com/api/v4/answers/796333432825032192' views = get_zhihu_views(zhihu_url) print('浏览量:', views) save_to_csv(views) print('已保存CSV文件:zhihu_views.csv') ``` 你需要将 `zhihu_url` 替换为你要获取浏览量的乎回答的URL。在这个示例中,我们使用了 `requests` 库来发送HTTP请求,并以JSON格式获取乎页面的数据。然后,我们解析这个JSON数据,提取出浏览量。最后,我们使用 `csv` 库将浏览量保存CSV文件中。 请确保在运行代码前已安装 `requests` 和 `csv` 库。你可以使用以下命令来安装它们: ``` pip install requests pip install csv ``` 希望这个代码对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玛卡`三少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值