爬一爬全球最大的同性交友网站
关注公众号,了解更多爬虫资讯
长按关注公众号
提起全球最大同性交友网站,你脑中想到的是什么?作为一个程序猿,如果你脑中闪现的不是GitHub,那么你绝对不是一个合格的程序猿。在GitHub上有着许许多多大佬,我等平民只能仰望。虽然技术不高,但是我们不能缺少一颗成为大佬的心。今天我们就来爬取一下这个网站中的各大大佬信息。
【版权声明】
本文中提到的源代码由读者“八九七十二”提供,版权归原作者所有,本文已取得作者授权。针对本文所有的打赏金额,将全部交给“八九七十二”本人。
【源码】
关注公众号,回复“github”获取源码
【项目目标】
本项目旨在从自身的GitHub账号出发,寻找到当前网站中Follows最多的账户及stars最多的项目。
【框架】
项目为作者作为爬虫入门时的代码,使用scrapy框架和requests库。
【网页分析】
首先登陆GitHub网站,在个人页面中使用开发者工具确认Followers在网页中的位置(见下图)。发现用户的一些数据存在于nav标签中,class属性为"UnderlineNav-body",以及该账号下的follower的ID在span标签中,
class属性为"link-gray pl-1" 。确定了这两个信息之后,我们就可以通过用户id来不断获取新的数据。
【部分源码】
以下是部分源码。想直接看结果的小伙儿伴可以跳过这部分。关注公众号,回复“github”获取全部源码
获取用户链接
def get_urls(self, u, *, start=1, stop=2):
users = []
for p in range(start, stop+1):
response = requests.get(u + '?page=' + str(p) + '&tab=followers',
headers={'User-Agent': random.choice(USER_AGENTS)})
root = etree.HTML(response.text)
for user in root.xpath('//span[@class="link-gray pl-1"]/text()'):
users.append(user)
try: # 检查有没有下一页
root.xpath('//a[text()="Next"]/@href')[0]
except:
break
return users
获取repo数据
def get_repos(self, u, *, start=1, stop=3):
repos = []
for p in range(start, stop+1):
response = requests.get(u + '?page=' + str(p) + '&tab=repositories',
headers={'User-Agent': random.choice(USER_AGENTS)})
root = etree.HTML(response.text)
for repo in root.xpath('//li[@class="col-12 d-block width-full py-4 border-bottom public source"]'):
name = repo.xpath('./div/h3/a/@href')[0]
stars = repo.xpath('./div[@class="f6 text-gray mt-2"]/a[@href="' + name + '/stargazers"]/text()')
if stars:
star = stars[-1].split()[0]
if star[-1] == 'k':
star = int(float(star[:-1])*1000)
else:
star = 0
forks = repo.xpath('./div[@class="f6 text-gray mt-2"]/a[@href="' + name + '/network"]/text()')
if forks:
fork = forks[-1].split()[0]
if fork[-1] == 'k':
fork = int(float(star[:-1])*1000)
else:
fork = 0
language = repo.xpath('./div[@class="f6 text-gray mt-2"]/span[@class="mr-3"]/text()')
if language:
language = language[0].split()[0]
else:
language = ''
repos.append(('https://github.com' + name, star, fork, language))
try:
root.xpath('//a[text()="Next"]/@href')[0]
except:
break
return repos
存储数据
def __init__(self):
conn = pymysql.connect(
host='127.0.0.1',
user='root',
passwd='666666'
)
conn.query('create database if not exists github ')
conn.commit()
conn.close()
self.conn1 = pymysql.connect(
host='127.0.0.1',
user='root',
passwd='666666',
db='github',
charset='utf8'
)
self.conn1.query('drop table if exists user')
self.conn1.commit()
self.conn1.query('drop table if exists repo')
self.conn1.commit()
sql_create_table_user = 'create table user (name char(70),repositories int(10),stars int(10),followers int(10),followings int(10))'
sql_create_table_repo = 'create table repo (repo char(80),fork int(10),star int(10),language char(20))'
self.conn1.query(sql_create_table_user)
self.conn1.commit()
self.conn1.query(sql_create_table_repo)
self.conn1.commit()
self.insert_user = 'insert into user(name,repositories,stars,followers,followings) values("{name}","{repositories}","{stars}","{followers}","{followings}")'
self.insert_repo = 'insert into repo(repo,fork,star,language) values("{repo}","{fork}","{star}","{language}")'
【爬取结果】
首先看一下Follows数量排名,由于爬取数量有限,爬取最多的结果为4300follows。我们的代码还需要优化。
全仓库star排名
以python为主的仓库star排名
最后我们看一下语言排名,JS一枝独秀,紧随着Python、Java、Html、CSS、Ruby都相差不多。
最后,以上数据都是基于爬取到的数据进行的分析,数据样本较少,仅做参考。
【投稿】
如果您也有好的项目想和大家分享,请关注公众号,点击底部【投稿】按钮联系小编。
关注公众号,了解更多爬虫资讯
长按关注公众号
【广告】
如果您觉得本文不错,请动动您发财的小手点一点文末的广告。您的支持是小编最大的动力。感谢大家的支持~