前言
之前一直在CSDN上写点东西,最近觉得CSDN上质量越来越低,广告反而越来越多,关注掘金也有一段时间了,目前来看还是比较纯净的技术社区,质量也相对较高,于是打算以后就在掘金上记录点东西吧。
主题
第一次在掘金写文章,不知道写点什么比较好,刚好最近在练习爬虫,受到一个爬取知乎的案例启发,决定来爬一爬掘金的数据。
所以本文就简单介绍一下如何从粉丝关系入手,爬取掘金用户信息。
开始
因为我们主要从用户关系入手,首先选取一个粉丝数量较大的用户作为起点,然后开始爬取其关注的用户和他的粉丝。
这里选了一个粉丝数量较多的用户:
可以看到有1w多的粉丝量。这里说一下为什么要选一个数量大的用户:这里选一个用户就是选一个起点,然后根据粉丝关系向广度和深度延伸,能延伸到多大的范围理论上来说是 跟起始用户的选择有很大关系的。粉丝量或者关注的人越多,能延伸到的用户就越多。所以尽可能选择一个数量较大的用户。
然后开始分析粉丝信息,关注的人和粉丝分析方法是一样的,找到其中一个方法就能很快解决另一个。
分析
我们简单分析一下就可以知道,在用户个人信息页面有一个关注者,点击之后就能看到粉丝列表。
然后分析网络请求,发现是这样的:
其中的 currentUid 可以不要,所以这个请求就只有一个动态的参数,那就是当前用户的id,当前用户的id很容易得到。
然后我们可以看到究竟返回了哪些信息
继续往下翻可以发现,第一次的请求是通过点击 关注者 按钮发送的,后边更多的粉丝信息是通过 ajax 查询的。但是通过ajax发送的请求和第一次不同。
可以看到 ajax的请求都多了一个before参数,这个参数从哪里来呢? 如果仔细分析了前边返回的json信息就会发现,每个用户都有一个 updatedAtString 字段,而下一次的请求都和上一次有关,下一次请求的 before 的值
分析到这里就很明显了,一共分为以下几步:
- 先选取一个粉丝量较大的用户。
- 先发起第一次请求,获取前20位粉丝。
- 记住最后一位粉丝的 updatedAtString 字段,进行下一次请求。
- 如此循环
同理可以处理关注的人。
数据结果
由于速度太快会拿不到数据,所以在爬取的时候限制了速度,爬取20W+数据还是花了一些时间的,数据我已经导出放在 gayhub 有兴趣的可以看看。
缺点
- 首选不能获取到那些没有关注的人、也没有粉丝的人。这些人触及不到,不可达。
- 其次即使有些人有关注也有粉丝,也有可能获取不到,但是最初选取的人粉丝量越大理论上来说,能够触及的用户越多。
优化
最后如果想拿到更多数据,可以在爬取完成之后,选取粉丝数较大的用户,或者关注的比较多的用户列表,重新爬取一遍。会拿到更多数据。
项目地址
由于本人是新手菜鸡,代码写的不够优雅就不贴出来了,不过有兴趣的还是可以看看。