基于Python的健康数据爬虫设计与实现

2019-06-10 01:01程增辉夏林旭刘茂福
软件导刊 2019年2期
关键词:爬虫

程增辉 夏林旭 刘茂福

摘 要:在网络健康资讯研究中,数据获取是首先要解决的问题,但传统抓取工具无法满足多变的数据源,研究高效爬取健康资讯内容新方法迫在眉睫。基于Python的网络健康资讯抓取方案,整合多个数据源,抓取内容更为全面;利用WebDriver和Python的Selenium库,能够较好地应对复杂网络状况,通过多线程技术极大提高爬虫效率。对抓取的癌症数据进行统计分析,对多线程效率进行对比分析,显示爬虫具有良好的适应性。基于Python的网络健康咨询抓取方案能快速抓取网络资讯,为后续科研打下基础。

关键词:爬虫;多数据源;Python;网页解析

DOI:10. 11907/rjdk. 181626

中图分类号:TP319文献标识码:A文章编号:1672-7800(2019)002-0060-04

Abstract: During the research of online health data, the data acquirement is the first problem to be solved, however the traditional data crawlers cannot be adapted to the current various data sources. Therefore, a new approach should be adopted to parse health data efficiently from Weibo, Web portals and other platforms. This article tries to design a new data crawler based on one Web driver offered from selenium library and implement using Python and its related network library. This data clawer can handle complex net environment and improve efficiency with the multithread technique. In the end, we analyze the obtained data on topic of cancer and compare the efficiency under the multithread programming. It shows that the data crawler designed in this article can adapt the net environment well and be a lot of helps in the further research of online health data.

Key Words:crawler; various data source; Python; Web page parsing

0 引言

隨着生活水平的不断提高和计算机技术的迅速发展,互联网已经成为大众获取资讯的主要渠道[1],网络资讯形式与内容也伴随着时代发展产生了巨大变化。在资讯形式方面,典型的门户网站仍以图文形式的文章为主,新兴平台的资讯形式则更为丰富,出现了微博、短视频、移动新闻客户端等格式。在资讯内容方面,除传统的时事新闻外,健康、娱乐等方面的内容更受年轻人追捧。新型资讯形式的出现,意味着对于网络数据的研究方法必须作出相应改变。网络数据内容的变更,意味着数据挖掘与研究工作的重心也要随之变化。

国外针对社交平台(如Facebook、Twitter)的研究与分析[2-4]较多,而国内针对这一领域的研究还较欠缺。一方面,相关研究刚刚起步,缺乏相关研究方法;另一方面,缺乏相关研究数据,深入研究难以展开[5]。新浪微博占据了社交平台87%的份额,聚集了大量年轻用户和海量资讯内容,是中国微博产业的主导力量[6]。微博具有用户基数大、传播速度快、内容时效性强和数据量极大的特点,是非常好的数据来源。另外,主流门户网站如网易、新浪、腾讯、搜狐等,作为老牌的“网络新闻集散地”,仍是用户获取资讯的主要来源。这些平台拥有大量用户,每天产生海量数据,并且新闻形式较为统一,是非常方便且有价值的研究对象。

网民对健康问题较为重视,“微信计步”、“悦跑圈”等一些健康类型手机应用风靡社交平台,健康类资讯成为人们分享的热点。医疗卫生信息化使医疗卫生数据以惊人的几何速度增长[7]。目前,已有针对网络健康数据的相关研究[8-11],如果能及时抓取网络上的健康资讯并加以深入分析与挖掘,或许能对网络舆情进行有效检测和引导,同时能分析出不同平台用户特点和关注点,使之更为个性化和人性化。然而,网络上的健康资讯十分零散,无法做到有效整合,而且因为资讯来源和平台不同导致不同资讯在结构上具有较大差异。因此,健康领域的网络数据研究具有很大的潜力可以挖掘。

已经开发出一些爬虫工具获取研究数据,但这些爬虫对社交平台和门户网站的新型网页结构支持不够,在研究中容易出现各种问题。其往往只针对特定平台进行适配,不具备普适性。除此之外,由于开发时间较长,缺乏对新技术的支持,很难适应当前的网络环境。

本文爬虫通过对各平台网页结构的分析,支持微博、门户网站等主流数据源,在一定程度上保证了数据的完整性。Python提供了针对网络协议标准库,对网络协议的各个层次进行了抽象封装[12],因而十分适合于网络爬虫开发。本文爬虫以Python为技术基础进行开发, 综合运用多个Python网络函数库,能够很好地适应当前的网络环境。

1 微博爬虫

微博用户基数大,资讯的更新与传播速度远远高于一般网络媒体,是非常好的数据来源。目前针对微博平台的数据爬虫研究[13-16]大致可分为基于API、基于网络爬虫和基于网络数据流3种获取技术[17]。然而,微博登录机制复杂,其提供的API存在访问数量、频率等方面的限制。此外,微博的网页结构与传统网页区别很大,结构更加细碎繁琐。因此,如果要大规模爬取微博数据,传统爬取方法可能不再有效,需另辟蹊径。Selenium是一个自动化测试工具,具有以下几个特性:①可对多种浏览器进行测试,如IE、Firefox、Safari、Chrome、Android手机浏览器等;②支持多种语言,如Java、C#、Python、Ruby、PHP等;③跨平台,如Windows、Linux、iOS、Android等;④开源免费[18]。本文爬虫利用Python中Selenium开源库的模拟特性,期望实现微博数据的高效爬取,同时将数据进行结构化存储,使数据更加条理清晰。

1.1 爬取流程

微博爬虫工作流程如图1所示。与传统网站不同,由于新浪微博的限制,需要首先进行登录,之后才可进行数据抓取。登录以后,选定 “新浪健康”账户为种子用户,逐步解析并获取微博内容,更新用户队列作为后续爬取对象。最后对微博进行结构化存储,方便后续使用。

1.2 微博登录

登录微博后才能爬取数据,因而首先要解决微博登录问题。与传统的会话方式不同,本文通过模拟用户的登录动作实现微博登录,这会使新浪微博系统将爬虫程序当作真正的用户,从而省去诸多麻烦。Python的Selenium库拥有成熟的模拟特性,其提供了方便的接口用以定位网页上的按钮与文本框。

微博登录步骤:①初始化Selenium库中的driver,利用driver.get(url)函数获取页面信息;②通过driver.get_element_by_name()函数定位“用户名”及“密码”输入框,通过driver.get_element_by_xpath()函数定位“登录”按钮,利用send_keys()函数输入用户名及密码;③利用click()函数模拟点击“登录”按钮。登录成功之后,只需维持driver便可方便地访问微博数据。

1.3 内容获取

登录之后便可进行内容获取。微博网页包含各种内容及对象,结构复杂,但是每条微博形式类似,一般包括作者、正文、点赞量、转发量、评论量等。首先通过Selenium开源库中的driver.page_source()函数进行页面源码抓取,然后利用正则表达式对网页内容进行筛选。为了方便存储,将作者、正文、评论量、点赞量、转发量等作为一条记录存储在数据库中。

为保证微博爬取的完整性和高效性,本文采取一种基于深度优先的爬取策略。于娟等[19]对主题爬虫进行了综述研究,阐述了多种主题爬虫的抓取策略。本文爬虫以“健康”为主题进行内容筛选,采用基于文字内容的启发式策略。首先选择“新浪健康”微博用户作为种子用户,获取其所有的微博内容并存储。在与其关联的用户中,以“健康”、“医生”、“医药”等关键词进行筛选,依次爬取并存储该用户的微博,如此反复,即可获得大量的健康微博资讯。

2 门户网站爬虫

门户网站页面内容包罗万象,包含文字、图片甚至音频、视频等,页面结构及源码较为复杂。但是,门户网站往往对相同主题内容作了归类,因此不需要对资讯内容进行筛选。利用Python的Selenium库、BeautifulSoup和正则表达式可以实现对内容的准确定位,以期实现高效爬取。

2.1 内容获取

爬虫的首要任务是获取目标网页内容,以便后续分析和研究。传统的HTTP请求方式获取网页HTML源码,由于存在编码格式和网站自身的访问限制等问题,极易出现错误,如编码格式差异导致的字符乱码、爬取速度过快导致的网站封锁访问等等。本文爬虫通过模拟用户浏览,利用Selenium库提供的函数对HTML源码进行获取,通过正则表达式提取源码,可有效避免上述问题。

门户网站通常将同类新闻放在同一频道中,健康内容获取分为两步:①获取健康新闻列表;②根据列表获取详细的资讯内容。因此,爬取过程需要维护一个新闻列表队列和多个爬取线程。在初始状态下,首先依据新闻列表获取健康资讯地址并存入队列中。多个爬取线程根据新闻队列情况读取队列中的地址爬取健康资讯。利用Selenium库中的driver.page_source()获取源码,然后利用BeautifulSoup对页面进行解析。BeautifulSoup能够从HTML或XML文件中提取数据,能够通过用户指定的转换器实现通用的文档浏览、查找和修改[20]。筛选出资讯的标题、作者、发表时间、来源、正文等信息后,作为一条记录存储到相应的数据库中,一旦队列为空则结束线程停止爬取。

2.2 相关问题

在实践过程中,为了增强程序的健壮性,使之面对各种问题时仍能高效稳定运行,本文对爬虫细节作了诸多修改:①为了更真实地模拟网页浏览过程,防止因频繁访问而被网站封锁,本文爬虫设置了随机时间间隔。在兼顾效率和稳定性的情况下,根据实验结果,将间隔设置为2~5s;②为了更好地處理因网络状况不佳而出现的爬虫中断,为爬虫设计了断点记录功能。在获取新闻列表和详细资讯内容的同时,将正在爬取的地址和其在新闻列表中的位置保存起来。爬虫重新启动时,根据断点位置继续运行,无需从头开始,这一功能可节省大量时间;③为了提高效率,采用了多线程技术,多个线程同时爬取新闻内容可大幅提高效率。

3 实验分析

本实验分为3部分:①对爬虫的多线程效率进行对比分析;②对爬取的数据依据年月进行统计分析;③对以“癌症”为关键词的资讯进行统计分析。

在爬虫效率测试中,选取腾讯健康频道作为数据源,通过设置不同的线程数量进行多次速度测试,时间效率统计如表1和图2所示。

经计算:从单线程到双线程,爬虫速度提升了33.75%;从双线程到三线程,爬虫速度再次提升了20.45%;而从三线程到四线程,爬虫速度的提升微乎其微,仅仅有0.8%。直接对比单线程与三线程,爬虫速度则提升了47.36%。

不难看出,多线程技术的引入极大提升了爬虫效率。然而当线程较多时,系统需要分配出一定资源维护各个线程;同时考虑到网络带宽等因素,此时增加线程对爬虫速度的影响已不明显。因此,多线程技术的使用对计算机本身的计算能力也是一种考验,需要综合考虑机器性能、网络带宽等各种因素。

本实验针对新浪、网易、腾讯三大门户网站,爬取了2015年1月至2016年12月期间总计9 422篇健康类文章。对这些文章按照年月进行统计,如图3所示。

由图3可知,按月份计算,2015年的文章数量始终多于或等于2016年同期。与此同时,微博、移动新闻客户端等资讯平台因其传播便捷性、内容时效性和与传统平台不同的社交属性,更加符合移动互联网特点,越来越受到年轻用户的关注与喜爱,不断抢占传统门户网站市场。作为研究者应敏感地觉察到这一趋势,及时调整未来的研究方向。

对这些文章的主体进行关键字匹配与分析,主要匹配了“癌”、“肿瘤”这两个关键词,并按照年月对这些文章进行统计,如图4所示。

从图4可知,以“癌症”为主题的健康文章数量每月始终在140篇上下波动,其始終是人们关注的焦点。比较2016年与2015年两年的情况,两条曲线拟合较好,并未受到微博、移动新闻客户端等平台冲击,进一步佐证了“癌症”健康资讯的焦点属性。

4 结语

本文提供了健康数据爬取工具,集成了门户网站、微博等多数据源,使得爬取内容较为全面;另外,本文爬虫支持多线程技术,能够达到较高的爬取效率。然而,面对复杂的网络,本文爬虫仍存在一些问题,有进一步优化的空间。例如,通过缓存与多进程技术可以再次提升爬虫效率,建立分布式爬虫以应对海量数据。本文爬虫工具的实现,为后续研究工作奠定了基础。

参考文献:

[1] 中国互联网络信息中心(CNNIC). 第41次中国互联网络发展状况统计报告[R]. 2018.

[2] CARLISLE J, PATTON R. Is social media changing how we understand political engagement?an analysis of Facebook and the 2008 presidential election[J].  Political Research Quarterly,2013,66(4):883-895.

[3] STRAFLING N,KRAMER N C. The influence of social aspects and personality on the usage of social media for study related exchange[J]. Gruppendynamik und Organisationsberatung,2013,44(4):402-403.

[4] CUNLIFFE D,MORRIS D,PRYS C. Young bilinguals language behaviour in social networking sites: the use of welsh on facebook[J]. Journal of Computer-Mediated Communication,2013,18(3):339-361.

[5] 周中华,张惠然. 基于Python的新浪微博数据爬虫[J]. 计算机应用,2014,34(11):3131-3134.

[6] 廉捷,周欣. 新浪微博数据挖掘方案[J]. 清华大学学报:自然科学版,2011,51(10):1300-1305.

[7] 卞伟玮,王永超. 基于网络爬虫技术的健康医疗大数据采集整理系统[J]. 山东大学学报:医学版,2017,55(6):1-9.

[8] 黄晓琴. 医疗健康大数据关键问题及对策研究[J].  中国数字医学,2016(5):81-83.

[9] 颜延,秦兴彬,樊建平,等. 医疗健康大数据研究综述[J].  科研信息化技术与应用,2014(6):3-16.

[10] 董诚,林立,金海,等. 医疗健康大数据:应用实例与系统分析[J]. 大数据,2015(2):78-89.

[11] 代涛. 健康医疗大数据发展应用的思考[J]. 医学信息学杂志,2016,37(2):2-8.

[12] 陈琳,任芳. 基于Python的新浪微博数据爬虫程序设计[J].  信息系统工程,2016(9):97-99.

[13] 卢杨,李华康,孙国梓.  一种基于P2P技术的分布式微博爬虫系统[J].  江苏大学学报:自然科学版,2016(3):296-301.

[14] 李学龙,龚海刚.  大数据系统综述[J].  中国科学:信息科学,2015(1):1-44.

[15] 程学旗,靳小龙,王元卓,等.  大数据系统和分析技术综述[J].  软件学报,2014(9):1889-1908.

[16] 彭希羡,朱庆华,刘璇.  微博客用户特征分析及分类研究——以“新浪微博”为例[J].  情报科学,2015 (1):69-75.

[17] 余容,李光强. 微博文本挖掘研究综述[J],情报探索,2017(5):97-103.

[18] 卢晨. 基于Selenium进行Web应用测试研究[J]. 软件导刊,2015,14(1):154-155.

[19] 于娟,刘强. 主题网络爬虫研究综述[J]. 计算机工程与科学,2015,37(2):231-237.

[20] 时永坤. 基于WebDriver的定向网络爬虫设计与实现[J]. 软件,2016,37(9):94-97.

(责任编辑:杜能钢)

猜你喜欢
爬虫
利用网络爬虫技术验证房地产灰犀牛之说
基于Python的网络爬虫和反爬虫技术研究
利用爬虫技术的Geo-Gnutel la VANET流量采集
大数据背景下校园舆情的爬虫应用研究
大数据环境下基于python的网络爬虫技术
基于Heritrix的主题爬虫在互联网舆情系统中应用