查看原文
其他

爬一爬全球最大的同性交友网站

27315 从零开始学爬虫 2019-05-25

关注公众号,了解更多爬虫资讯

长按关注公众号




提起全球最大同性交友网站,你脑中想到的是什么?作为一个程序猿,如果你脑中闪现的不是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都相差不多。

最后,以上数据都是基于爬取到的数据进行的分析,数据样本较少,仅做参考。



【投稿】


如果您也有好的项目想和大家分享,请关注公众号,点击底部【投稿】按钮联系小编。

关注公众号,了解更多爬虫资讯

长按关注公众号


【广告】


如果您觉得本文不错,请动动您发财的小手点一点文末的广告。您的支持是小编最大的动力。感谢大家的支持~


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存