爬取github上commits在1200次以上的用户及commits分布情况
简介
前段时间,帮同学做了一个爬虫的作业,比较基础的那种,这里简单记录一下吧。要爬取的内容就是github上commits在1200次以上的人及其commits分布情况。完整代码下载地址:https://pan.baidu.com/s/1BUE5WqrCQ4PDEsS8aBX7Vg
准备
- 使用Python3.6
- 使用requests和BeautifulSoup库(不会用的可以看一下这两个中文文档requests和BeautifulSoup)
抓取用户个人页面
查看网址可以发现github用户页面网址格式都是"https://github.com/" + 用户ID,用户的几个页面格式是"https://github.com/" + 用户ID + “?tab=…”,这样我们就可以从一个用户开始,根据Followers和Following关系,爬取到大量的用户信息,我这里采用BFS(广度优先搜索)的思想,从一个用户ID为"u2"的用户开始,一层层的爬取用户的Following名单,并存到用户列表里备选。
代码如下:
#获取当前用户关注者列表下的用户名,放进备选用户列表里,并返回队尾
#函数参数为用户个人界面的url和队尾序号
def get_user_following(userFolloingUrl, userListTail):
req = requests.get(userFollowingUrl)
html = req.text
soup = BeautifulSoup(html,"lxml")
userFollowings = soup.find_all('span', class_ = 'f4 link-gray-dark')
for element in userFollowings:
userName = element.text.replace('\xa0'*8,'\n\n')
if userName != "":
userList.append(userName)
userListTail = userListTail + 1
return userListTail
获取commits信息
通过观察网址特点可以发现,每个用户每个月的提交信息网页url为:“https://github.com/” + 用户名 + “?tab=overview&from=” + 起始日期+"&to=" + 结束日期,以此特点遍历每个备选用户近七年每年十二个月的提交信息,确定其commits数量是否超过1200次。
代码如下:
while userListHead < userListTail:
if userDataNum >= 20 :
break
userName = userList[userListHead]
userListHead = userListHead + 1
userFollowingUrl = "https://github.com/"+userName+"?tab=following"
userListTail = get_user_following(userFollowingUrl, userListTail)
time.sleep(int(random.uniform(2,4)))
commitsNum = 0
print("Get the user's following successfully")
#遍历该用户最近七年每个月的commits记录
for year in ["2018","2017","2016","2015","2014","2013","2012"]:
for month in range(12,0,-1):
eachMonthCommitsUrl = "https://github.com/"+userName+"?tab=overview&from="+year+startDate[month]+"&to="+year+endDate[month]
time.sleep(int(