最近在上某网的数据分析课程,其中有一个项目要求用 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:。
领取专属 10元无门槛券
私享最新 技术干货