基于ScrapyGitHub数据爬虫
作者:赵本本 殷旭东 王伟
来源:《电子技术与软件工程》2016年第06
        要作为最大的社交编程及代码托管网站,GitHub提供了丰富的数据来源。基于Python开源框架Scrapy设计实现了一个Web爬虫,能对GitHub的资源抓取和分析,并进行了结构化处理和存储,可为后续数据分析提供基础。介绍了GitHub爬虫的设计原理、算法的实现方式,对实验结果进行了分析。
        【关键词】网络爬虫 数据爬取 Scrapy GitHub Python NoSQL
        数据产生于各行各业,在互联网时代大数据概念提出后,人们发现自己手中的数据不再毫无用处,通过强大的技术手段,无形的数据可转化为有形资产。麦肯锡公司的报告指出数据是一种生产资料,大数据是下一个创新、竞争、生产力提高的前沿。 世界经济论坛的报告也认定大数据为新财富,价值堪比石油。GitHub是一个巨大的数据宝库,吸引了大量的开发人员与研究人员入驻。2014年的《GitHub中国开发者年度报告》指出,目前 GitHub 上的注册用户数量已经超过1000万。由于网站托管的开源项目众多,访问的流量也呈爆炸性增长。要想从数千
万程序员中快速、准确地抓取所需要的信息变得越来越困难,所以必须使用自动化工具才能较容易的抓取下来。
        本文设计并实现了一个基于Scrapy框架的Web数据爬虫,从GitHub抓取大量用户数据信息,下载到本地,进行了结构化处理和存储,为之后做数据分析提供基础。
        1 网络爬虫与Scrapy
        所谓网络爬虫,就是抓取特定网站网页的HTML数据。网络爬虫从一个存放URL的集合开始进行爬取,首先从队列中获取一个URL并下载此网页,提取该网页中的其它URL并放入队列中。此过程将重复直至关闭。常见的网络爬虫及其爬行策略包括:
        1)广度优先爬虫,一般全网搜索引擎的网络爬虫使用广度优先的爬行策略。
        2)重新爬取已有的页面的爬虫,目的是获得数据的定期更新。
        3)聚焦爬虫,也叫定向爬虫,为很多垂直搜索引擎使用,采取特定的爬行策略来爬取特定类型的网页。本文所研究的正是这一类型的网络爬虫。例如,网页上的某个特定主题或语言、图像、MP3文件等。
        Scrapy是用Python开发的一个开源的Web爬虫框架,可用于快速抓取Web站点并从页面中高效提取结构化的数据。Scrapy可广泛应用于数据挖掘、监测和自动化测试等方面,提供了多种类型爬虫的基类,如BaseSpiderSitemapSpider等。
        2 基于ScrapyGithub数据爬虫的设计
        2.1 Scrapy原理
        Scrapy是基于Twisted异步网络库来处理通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。其工作原理为:首先从种子URL开始,调度器会传给下载器进行下载,之后会交给爬虫进行分析,根据分析结果进行不同处理。如果是需要进一步爬取的链接,这些链接会传回调度器;如果是需要保存的数据,则被送到项目管道组件进行后期处理,包括详细分析、过滤、存储等。此外,在数据流动的通道里还允许安装各种中间件,进行必要的处理。
        2.2 GitHub数据爬虫
        2.2.1 GitHub网页结构与数据分析
        GitHub个人主页的主要信息可分为左右两块:左块为个人基本信息,右块为个人相关的项目。个人基本信息包括名字、邮箱、公司、头像等,爬取时会按照编写的爬虫规则全部保存下来,同时右块的项目信息也储存在JSON文件中。格式为:
        {
        “_id”
        “fullname”
        “mail”
        “username”
        “organization”
        “joined”
        “starred”
        …
        }
        2.2.2 数据定义
        Item是保存爬取到的数据容器,使用方法和Python字典类似。根据从GitHub网站上获取到的数据followersfullname等对Item进行统一建模。从而在Item中定义相应的字段field。对应的item.py中的主要代码为:
        import scrapy
        class GithubItemscrapy.Item):
        fullname = scrapy.Field()
        username = scrapy.Field()
        popular_repos = scrapy.Field()
        …
        2.2.3 编写提取Item数据的Spider
        GitHubSpider是用于GitHub网站爬取数据的类,选择从scrapy.Spider类继承。定义以下属性和方法:
        1name属性:定义spider名字的字符串且唯一;
        2start_urls属性:Spider在启动时从url列表开始进行爬取。第一个被获取到的页面将是其中之一,后续的URL则从初始的页面中提取;
        3parse:是Spider的一个方法。每个初始URL完成下载后生成的Response对象将会作为唯一的参数传递给该方法。该方法解析提取Item数据以及生成需要进一步处理的URLRequest对象。
        Scrapy提取数据使用Selector选择器机制,使用特定的XPath表达式来提取HTML网页中的数据。此爬虫提取GitHub用户主页中的followers数据项使用代码:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。