大数据时代下爬虫技术的兴起
作者:黄聪 李格人 罗楚
来源:《计算机光盘软件与应用》2013年第17期
        摘 要:大数据时代下,人类社会的数据正以前所未有的速度增长。问卷调查法、访谈法等传统的数据收集方法,因样本容量小、信度低等局限已无法满足高质量研究的需求,相比较而言,编写爬虫程序获取到的海量数据更为真实、全面,在信息繁荣的互联网时代更为行之有效。因此编写爬虫程序成为大数据时代信息收集的必备技能。本文主要介绍爬虫原理、scrapy爬虫框架,并以歌词爬取为例,详细讲解使用scrapy爬取数据的步骤。
        关键词:大数据;爬虫;scrapy;歌词爬取
        中图分类号:TP391.3
        2012年2月12日《纽约时报》发表文章“The age of big data”[1],作为主流媒体告诉人们,大数据真实地存在人们身边,而不是科技概念上的炒作。TeckTarget的一份调查显示[2],
伴随业务增长以及互联网、社交媒体等领域的发展,已有超过57.1%的企业数据量突破TB级别。在社交媒体上,Twitter每天的信息数达到3.4亿,Facebook每天的分享和发布量达到40亿,YouTube每天上传的影片内容多达5万小时。全球著名咨询公司麦肯锡对大数据给出定义[3]:无法在可容忍的时间内用传统IT技术和软硬件工具对其进行感知、获取、管理、处理和服务的数据集合。我们不缺乏数据,缺乏的是从数据中提取出知识的能力[4]。
        一般来说,行为科学的研究范式遵循先在原有理论基础上构造新的概念模型,然后通过数据收集、数据分析,最后证明概念模型能比现有理论更好地解释现实中企业或人们行为的规律。这样一来,数据收集方法的准确性、全面性对后续研究而言极为关键。但传统意义上的数据收集方法,如问卷调查法,访谈法等,其样本容量小、信度低、且受经费和地域范围所限,因而收集的数据往往无法客观反映研究对象,有着较大的局限性。正如“信息处理的准则——garbage in garbage out”所揭示的,如果输入的是无效信息,无论处理的程序如何精良,输出的都是无用信息。可见,对比传统的数据收集方法,立足于海量数据的研究有以下的优点:
        (1)数据的真实性。使用问卷调查法收集数据,调查者难以了解被调查者是认真填写
还是随便敷衍。事实上,大多数被调查者因为对调查问题不了解、回答方式不清楚等原因而敷衍了事,使得后续研究的价值大打折扣。而通过爬虫技术能快速获取真实、客观反应用户行为的数据,如用户在社交网络上对企业的评论显然要比在接受问卷调查时的回答真实。这是因为,前者是用户自愿与好友分享自己的购物经历或用户体验,而后者受调查环境所影响,若被调查者存在一定的心理压力,则做出的反馈可能会有失偏颇。
        (2)样本容量。维克托·舍恩伯格指出[5],在成本限制下,采样的目的就是用最少的数据得到最多的信息,前提是要保证样本间的相互独立性。而传统的数据方法常常难以保证这一点,因为传统的数据收集方法在选择样本时常受到调查者自身因素的影响,如挑选友善的人或自己的朋友,这样就难以保证样本的随机性和代表性,加上在过滤掉虚假样本后,真正能用来做分析处理的样本容量非常少。相比较而言,使用爬虫对互联网上的海量数据进行收集、分析,即所谓的“样本等于全体”的全数据模式,能更好地反映客观事实,而数据愈全面,分析研究的结果也就愈真实。
        可见,爬虫不仅仅是一门技术,更是在大数据环境下进行高质量科学研究的一把新钥匙。掌握爬虫技术,已成为当下研究工作者的必备技能。下面笔者将阐述爬虫的原理及scrapy爬虫框架,并以爬取歌词为例,详细讲解使用scrapy爬取数据的步骤。
        1 爬虫原理
        我们浏览的网页数以亿计,它们在世界各地的服务器上存储着。用户点击一个网页的超链接以跳转的方式来获取另一个页面的信息,而跳转的页面又有链接存在,网页便由超链接组成一个巨大且错综复杂的网。而Web爬虫(Crawler),也称蜘蛛(Spider),则是穿梭在这巨大的互联网中下载网页解析内容的程序。
        爬虫的应用很广泛。在商务智能上,企业使用爬虫收集竞争对手的情报或在社交网络、虚拟社区上爬取用户对企业的评价从而在产品服务上做出改进等。在数据研究上,爬虫能快速收集互联网上的信息,为数据分析提供原始资料。
spider软件        图1 爬虫算法流程图
        图1[6]为一个简单爬虫算法的流程图:从一系列种子(Seed)网页开始,使用这些网页的链接去获取其他页面,把这些网页中的链接依次提取出来后,访问链接对应的页面。在网络爬虫中,使用哈希表记录一个页面是否被访问过,未被访问的链接则放入队列。由调度算法,每次从队列中取出一个URL,然后通过HTTP协议爬取对应页面,保存到网页库。整个过程不断重复,直到有足够的网页被访问过,或者已达到其他的既定目标。
        2 使用Scrapy框架实现爬虫
        Scrapy是一个用Python语言实现的爬虫框架[7],任何人都可以根据各自的需求对其进行修改,然后实现对目标网站的抓取。
        Scrapy框架的数据流向首先从初始URL开始。调度程序(Scheduler)接受请求,并对URL进行排序,接着发送请求给下载器(Downloader),下载器抓取网页并将网页内容返回给爬虫(Spiders)。爬虫分析出来的结果有两种:一种是需要进一步抓取的链接,放回调度器;另一种是需要保存的数据,则被送回项目管道(Item Pipeline),项目管道负责清洗数据,验证解析出来的数据,检查数据是否和已存储的数据重复,有则丢弃,最终将清洗后的数据存储到数据库中。
        以下演示使用scrapy爬虫框架在中文歌词库[8]上,对歌手的名字及歌手对应的链接地址进行抓取。
        2.1 建立爬虫项目文件
        使用scrapy框架建立爬虫项目,只需在命令行输入“ scrapy startproject lyric”,scrapy框
架会自动建立一个名为lyric的工程项目,目录结构:
        “lyric/
        scrapy.cfg
        lyric/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
        __init__.py”
        其中scrapy.cfg是整个项目的配置文件。items.py是爬虫项目设置存储对象的文件。pipelines.py作用是将网页解析后的对象存储到数据库。settings.py是项目的设置文件,一是根据项目需要,设置爬虫的深度,避免爬虫在网页深度上无限制抓取网页;二是设置爬虫的频率,爬虫抓取网页的频率过快,会被该网站视作网络攻击被屏蔽。spiders文件夹下放置的是实现爬虫逻辑的文件。
        2.2 定义存储对象
        这里定义需要存储的对象:歌手名称,歌手页面的链接。Items是存储已抓取数据的容器,它类似于python中的字典类型,但加入了额外的保护措施。在items.py的文件下输入以下代码:
        “from scrapy.item import Item, Field
        class LyricItem(Item):
        singerName = Field()
        singerLink = Field()”
        2.3 编写爬虫逻辑
        在spiders文件夹下,编写爬虫抓取数据的逻辑。首先需要设定爬虫的名字,这个名字必须是唯一的,最终调用scrapy程序抓取数据时需用到。在这个例子中,爬虫的名字是Lyric。接着,定义爬虫开始爬取的网址,即是要爬取数据的目标网址。
        Scrapy编写爬虫程序,最核心的地方是编写解析网页程序的逻辑。parse即是用来解析网页程序的方法,用来处理HTTP响应的Response对象,用xpath表达式从网页中提取对象后,赋值给用来存储数据的Item对象。这里简要介绍xpath表达式的用法[9]:
        (1)/html/head/title:表示选择网页源代码html文档中head元素下的title元素;
        (2)/html/head/title:表示选择title元素的文本;
        (3)//td:表示选择所有的 元素;
        (4)//div[@class="mine"]:表示选择所有含有属性class等于mine的div元素。
        本例中,抓取歌手名的xpath表示式为://ul/li/a/text()。意思是提取所有ul/li/a元素下
的文本,事实上,歌手名正是存取在这样的路径中。同理,歌手对应的链接的xpath表达式为://ul/li/a/@href,即是提取所有ul/li/a元素下的超链接。以下是代码逻辑:
        “from scrapy.spider import BaseSpider
        from scrapy.selector import HtmlXPathSelector
        from lyric.items import LyricItem
        class Lyric_Spider(BaseSpider):
        name = "Lyric"
        allowed_domains = ["cnlyric"]
        start_urls = ["http://wwwlyric/singerlist.html"]
        def parse(self, response):
        hxs = HtmlXPathSelector(response)
        singerlist = hxs.select('//ul/li')
        items = []
        for singer in singerlist:

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