Python 抓取掘金数据并保存为 CSV

最近在上某网的数据分析课程,其中有一个项目要求用 R 对自选数据集进行分析。在掘金灌水了半年多的我,第一时间就想到了抓掘金数据。我想要看看在掘金,除了文章内容外,还有哪些因素会影响一篇文章的阅读量。

要解答这个疑问,第一步需要做的事情便是拿到掘金的数据并保存为便于 R 使用的 CSV 格式。

查看数据源

从 Chrome 的控制面板- XHR 里可以看到掘金 timeline 的返回。

荐下我自己创建的Python学习交流群960410445,这是Python学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习Python的资料和入门教程。

其中有一条数据的名字是 「get_entry_by_rank」,看名字这应该就是我需要的数据。将 entrylist 中 collectionCount,commentsCount 等与timeline 显示的值对比,我发现我可以取到以下我觉得有用的数据:

但是有一个我认为很关键的值 —— 作者所有文章被阅读数 —— 没有在 「get_entry_by_rank」 中返回。好在 「get_entry_by_rank」中返回了作者 ID,我们可以通过这个 ID 进入到作者个人页面 ——juejin.im/user/ ,从而获取与文章作者有关的信息。在作者个人页面的返回数据中,我又找到了以下维度的数据:

从数据源获取数据

经过以上查找和对比,我确定了我需要掘金的两条 XHR 返回:

juejin.im/timeline 返回的 「get_entry_by_rank」

juejin.im/user/ 返回的 「get_multi_user」

我决定用 Python 库 Requsts 来自动化获取以上返回。

Requests: 让 HTTP 服务人类

使用 Requests 发送网络请求时需要先构造一个请求头,还需要传入 URL 以及 URL 参数。

复制 「get_entry_by_rank」 的 requests headers 查看请求头、 URL 及 URL 参数内容。

从 requests headers 中可以看到

URL : timeline-merger-ms.juejin.im/v1/get_entr…

URL 参数:

请求头:

将 URL 参数组装为字典 payload 赋值给关键字参数 params ,将请求头组装为字典 header 赋值给关键字参数 headers ,与 URL 一并传递 requests.get 方法便可发起一次请求:

.

r 即为本次请求的响应,使用 r.text 可以看到相应的内容。

从响应中提取需要的数据

Requests 内置了 JSON 解码器,可以处理 JSON 数据。

r = r.json()

可以将响应内容转换为 JSON 对象,然后利用 Python 的 JSON 库

import json

即可根据返回值名称提取所需的内容,将提取完的数据赋值给字典 data。

将 Data 保存为 CSV

以前一直是将数据直接保存为 JSON 格式,但是在数据分析中,比较常接触的是 CSV 格式的数据,所以这次我决定将数据直接保存为 CSV 格式。

不知道该怎么手写一个方法将 Data 逐字符写入 CSV 文件, Google 后了解到 Python3 自带的 csv 库专门解决这个问题。

通过 with open 打开一个文件,先写入 csv 文件的 header :

列表 fieldnames 中的值要与 data 中的 key 对应。 csv 文件的 header 写入之后便可以写入 data 了:

通过 csv 库,将 Python 的字典保存为 csv 文件变的异常简单。

其它

如何循环抓取 timeline 数据

掘金 timeline 每一次请求返回20篇文章的数据,第二次发起请求的时候 params 会多一个键 before ,该值为上一次请求最后一篇文章的 rankIndex ,通过 while 循环持续发起请求并且每次请求利用上一次请求的返回的数据更新 before 的值即可。

如何根据 ID 获取每篇文章作者相关信息

每一次 timeline 数据抓取成功后,顺序遍历返回数据,逐条对 「get_multi_user」 发起请求并执行与抓取 timeline 数据一样的流程。

PS

非专门的数据工程师,代码水平献丑,就不放 Github 丢人了。需要参考源码的同学可以私信微博DataMonologue。单独发你:joy:。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190116A0MCY800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券