相关文件
想学Python的小伙伴可以关注小编的公众号【Python日志】
有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!!
Python学习交流群:773162165
开发环境
Python版本:3.7.8
相关模块:
requests模块;
tqdm模块;
pyfreeproxy模块;
pyecharts模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
数据爬取
数据爬取部分,我们利用Github官方提供的API来实现:
https://api.github.com/repos/{username}/{reponame}/stargazers?page={page}
另外,根据官方的接口文档,我们需要申请一个access_token,在请求头中添加:
headers = {
'Accept': 'application/vnd.github.v3+json',
'Authorization': f'token {access_token}',
}
否则的话,我们每个小时可以获取到的数据将会少很多。access_token的获取方式如下图所示:
数据爬取的核心代码如下:
'''run'''
def run(self):
# 构造所有star的人的url
star_urls = []
for page in range(self.num_pages):
url = self.api_url.format(self.username, self.reponame, page)
star_urls.append(url)
# 爬取所有用户链接
user_info_urls, session = [], requests.Session()
for url in tqdm(star_urls):
while True:
headers = self.getheaders()
try:
response = session.get(url, headers=headers)
response_json = response.json()
break
except:
session = requests.Session()
if 'message' in response_json and \
response_json['message'] == 'In order to keep the API fast for everyone, pagination is limited for this resource. Check the rel=last link relation in the Link response header to see how far back you can traverse.':
break
for item in response_json:
if not isinstance(item, dict):
continue
if ('url' in item) and (item['url'] not in user_info_urls):
user_info_urls.append(item['url'])
self.save(user_info_urls, 'user_info_urls')
print(f'[INFO]: 共获得{len(user_info_urls)}条用户信息链接')
# 爬取所有用户信息
user_infos, session = [], requests.Session()
for url in tqdm(user_info_urls):
while True:
headers = self.getheaders()
try:
response = session.get(url, headers=headers)
except:
session = self.getsession()
continue
if response.status_code == 200 and 'id' in response.json():
break
elif response.json()['message'] == 'Not Found':
response = None
break
else:
session = self.getsession()
if response is None: continue
info = response.json()
user_infos.append(info)
print(f'[INFO]: 共获得{len(user_infos)}条用户数据')
self.save(user_infos, 'user_infos')
最终的运行效果如下:
可以看到原始repo大概有261k的star:
说明官方给的接口应该是有限制的,最多只能拿到40k左右的数据,不过这也足够我们拿来做后续的数据可视化分析啦~
大功告成啦,完整源代码详见相关文件~
数据可视化
首先,我们来看看反对996的人主要是什么公司的:
由于大部分人都没有在主页填写自己的公司信息,所以爬取到的几万条数据里,有效的部分少之又少。从图上看,点赞的主力军还是高校学生,其次才是互联网大厂的员工。(可能在加班没时间点star?)
接下来,我们来看看反对996的人里有多少是在社区是有影响力的,这里我们以用户在Github上的粉丝数量作为评判该用户在社区是否有影响力的标准,最终的结果如下:
可以发现,Github上还是有很多"大V"通过点赞来声援反对996的。
再来看看点赞的账户都是什么时候注册的吧:
看来点赞的基本都是有多年从业经验的老程序员而不是刚注册的新号?图片再来看看点赞者的邮箱域名统计结果吧:
看来点赞的人很多都是可以上谷歌的啊,一想到前面统计的点赞的人里大部分是学生,就感觉事情似乎并不简单。