Vol.46No.6Dec.2018
基于Scrapy的中药材网络信息采集方法研究
张喜红,王玉香
(亳州职业技术学院,安徽
摘
亳州
236800)
要:以中药材天地网站的信息收集为例,基于Scrapy框架设计了中药材品名、规格、产地、价格等信息提
取的爬虫。首先,借助浏览器的网页审查元素工具分析目标网页的结构,并抽取目标元素的XPath路径;接着,采用Scrapy框架构建网络爬虫工程,分别在相应的文件中设计目标元素的解析规则及元素的存储方法;最后利用设计的爬虫采集目标网站信息进行测试,以西洋参、三七为例,将线上采集数据与线下实地调研的数据进行对比。结果表明,所设计的爬虫能快速、高效、准确获取目标网站的信息,且与线下实地调研数据相符,可为后续的研究提供数据支撑。关键词:Scrapy;中药材;爬虫中图分类号:TP391.3
文献标志码:A
文章编号:1673-0143(2018)06-0522-06
DOI:10.163/j.cnki.cn42-1737/n.2018.06.006
CollectionMethodofNetworkInformationforTraditionalChinese
MedicinalMaterialsBasedonScrapy
ZHANGXihong,WANGYuxiang
(BozhouVocationalandTechnicalCollege,Bozhou236800,Anhui,China)
Abstract:Atpresent,thedatarelatedtoChineseherbalmedicinesontheinternetisincreasingbyestablishcommodityspecificationsandpricewarningmechanismtoguidethesmoothandorderlyrunningofthemarket.TakingtheinformationcollectionofTiandiwebsiteofChineseherbalmedicine
tensofthousands.Itisofgreatsignificancetoexcavatethepotentialrelationshipbehindthesedata,asanexample,aspiderbasedonScrapywasdesignedtoextracttheinformationofChineseherbalanalyzedandtheXPathpathofthetargetelementwasextractedwiththehelpofthewebpage
medicinename,specifications,origin,priceandsoon.Firstly,thestructureofthetargetpagewaselementsreviewingtoolofthebrowser.Then,thewebspiderprojectwasconstructedwiththeScrapyframework,andtheparsingrulesofthetargetelementsandthestoragemethodsoftheelementswerecollectedon-linewerecomparedwiththedatacollectedoff-lineandonthespot.Theresultsshowthatsubsequentstudy.
designedinthecorrespondingfiles.Finally,thespiderwasusedtocollecttheinformationofthetargetwebsitefortesting.TakingPanaxquinquefoliumandPanaxnotoginsengforexample,thedatathedesignedspidercanobtaintheinformationofthetargetwebsitequickly,efficientlyandaccurately,itisconsistentwiththeoff-linefieldsurveydata,alsoitcanprovidedatasupportforKeywords:Scrapy;traditionalChinesemedicinalmaterials;spider
收稿日期:2018-05-31
基金项目:安徽省青年人才支持计划项目(gxyq2018215);安徽省高校自然科学研究重大项目(KJ2016SD41)作者简介:张喜红(1983—),男,讲师,硕士,研究方向:数据挖掘与分析。
2018年第6期张喜红,等:基于Scrapy的中药材网络信息采集方法研究
523
0引言
中药材因其在治病救人、养生保健等方面的独特功效,长期以来受到人们的青睐,选用中药治病、
保健的人数逐年上升,中医药产业也得到了前所未有的发展,中药材市场交易活跃。与此同时,伴随着互联网技术应用的推广,中药材信息相关的网站大量涌现,如中药材天地、中国药材市场等,中药材行业也逐步由传统的线下交易向网上电子交易转型,互联网上中药材相关的信息量日以万计增长,当前已积累了大量的数据。
大数据分析的相关案例一次又一次证实,数据的背后隐藏着重大的价值[1-2]。因此,收集、挖掘这些数据,为各类药材建立相应的规格标准及价格信息预警机制,防范价格的奇异波动,指导市场优质优价有序运营,进一步确保中药产业持续健康发展具有现实意义。然而互联网上中药材信息数据内容大多是基于页面形式,需要进一步采集梳理才能用于分析。如何准确、快速收集整理这些网络数据是开展研究的首要任务。通常“网络爬虫”是实现网络信息自动采集的手段,然而现行的网络爬虫工具在信息收集时针对性不强,无法满足聚焦爬取的要求。基于Python语言开发的Scrapy开源爬虫框架用于二次开发聚焦爬虫极其方便。如:孙艺乘等[3]基于Scrapy框架实现了精准招商系统;李乔宇等[4]基于Scrapy实现了山东玉米价格的预警分析系统。
基于上述背景,鉴于中药材天地网站药材信息健全、更新及时等优点,本文以中药材天地网站为爬取目标,基于Scrapy框架设计,实现了亳州、安国、玉林、莲花池等知名中药材市场的网络信息采集,并以西洋参、三七为例,考察了线上采集数据与线下实地调研的数据相符程度。
1Scrapy简介
“网络爬虫”其本质是一段用于自动获取互联网网页的程序[5-6]。网络爬虫大致可分为通用和聚焦
两种,通用网络爬虫主要以抓取整个互联网的资源为主,是搜索引擎的核心部件,其工作流程是从特定数目的起始网页URL开始,逐层抽取网页上的URL链接地址,并抓取网页,直至符合终止条件。聚焦爬虫以提取网站网页的特定信息为主,与通用爬虫相比,在组成结构上需增加相应的过滤规则。中药材信息采集系统是有针对性地提取网页页面中的信息,属于聚焦爬虫。在没有框架的基础上设计一个聚焦爬虫需解决网络联接、爬虫规则、数据存储等多方面的问题,开发过程相对复杂[7-8]。为了简化爬虫设计工作,市面上涌现出许多优秀的爬虫框架,其中最具代表性的框架是Scrapy框架。1.1Scrapy框架分析
Scrapy是一款基于Python语言编写的开源框架,其使用了twisted异步网络库来处理网络通讯,极
大地提高了爬取效率[9-10]。Scrapy提供基础组件的同时还提供了自定义接口,兼具方便、灵活的特点。Scrapy框架的组件构成及工程目录结构如图1和图2所示,由引擎、调度器、下载器、爬虫、管道及一些工程目录中的scrapy.cfg文件进行配置,开发者一般不需改动;调度器的主要作用是管理网页链接优先级及地址去重队列;下载器的作用是下载并传递网页内容到爬虫;爬虫组件在工程目录下的Spiders文件夹下创建,开发人员需在其中实现声明爬虫名、指定域名范围、设定起始地址及目标信息解析方法等内容,是二次开发设计的重点内容;管道与工程目录的pipeline.py文件相对应,通常用于实现数据的储存操作;工程目录下的items.py中主要用于定义目标信息的存储框架。1.2Scrapy工作步骤
获得目标页URL地址;②引擎把目标页URL地址打包成一个请求传递到下载器;③下载器收到请求规则提取相应的item实体信息,并将item信息传入管道中;⑤管道对实体深度处理,如过滤、保存等。
Scrapy工作步骤由如下5步循环执行,直到符合停止条件终止,具体过程是:①引擎请求调度器,中间组件构成。引擎组件是Scrapy的核心,其作用是管理整个Scrapy系统的数据流程及事务触发,在
后,下载目标页面,并返回应答到爬虫;④爬虫收到下载器返回的目标网页应答包后,采用设定的解析
524江汉大学学报(自然科学版)总第46卷
图1
Fig.1
Scrapy框架示意图图2Fig.2
Scrapy框架的工程目录结构EngineeringdirectoryofScrapy
SchematicdiagramofScrapyframework
2系统的设计与实现
中药材天地网市场价格栏目区按天更新亳州、安国、玉林、莲花池等知名中药材市场各类药材的
2.1目标网页结构分析
价格信息,以其公布的信息作为研究数据极具代表性。市场价格栏目首页的域名是http://www.zyctd.
com/jiage/1-0-0.html,当访问时返回如图3所示的布局结构,在信息条目版块分多页按行给出了每种药
材的品名、规格、市场、最新价格等信息。利用浏览器的审查元素工具,分析各分页中的信息记录条对应的源码架构,可知每个分页中的信息记录条以多条
品名://*[@id=\"body\"]/section/div/div[3]/div[1]/div[2]/div/ul/li[21]/span[1]/a/@title;规格://*[@id=\"body\"]/section/div/div[3]/div[1]/div[2]/div/ul/li[21]/span[2]/a/@title;市场://*[@id=\"body\"]/section/div/div[3]/div[1]/div[2]/div/ul/li[21]/span[3]/@title;最新价格://*[@id=\"body\"]/section/div/div[3]/div[1]/div[2]/div/ul/li[21]/span[4]/text()。
(a)顶部局部
(b)底部局部
图3
Fig.3
中药材天地网市场价格栏目局部
LocalgraphofmarketpricefortraditionalChinesemedicinalmaterialsontheTiandiearthwebsite
2018年第6期
张喜红,等:基于Scrapy的中药材网络信息采集方法研究525
因信息记录条分页展示,所以爬取网页时还需获得各分页的URL,常规的做法是在每一页获取“下一页”按钮下的URL地址。实际解析发现:当处于不同的页数时,中药材天地网“下一页”按钮的URL地址所对应的XPath解析路径不同,不便于构造统一解析表达式。但是每个分页的URL地址具有取分页URL地址时,通过循环语句将首页地址与对应的分页页码数进行字符串拼接获得,循环的次数通过提取首页给出的最后一页页码数获得。2.2数据采集实现
搭建好Scrapy开发环境后,在CMD命令模式下通过scrapystartproject-项目名称命令创建Scrapy工程,首先在items.py文件中按“信息名=scrapy.Field()”格式定义品名、规格、市场、最新价格等信息对应的存储模板。在工程的spiders目录下创建爬虫Python文件,并编写爬虫代码。具体代码如下所示:
importscrapy//导入框架包name=\"zyc\"//定义爬虫
frommovie.itemsimportZYCItem//导入item实体类allowed_domains=[\"www.zyctd.com\"]
一定的规律性,都是在首页地址的基础上追加“-页码”构成,且首页给出了最后一页的数值,因此在抽
classZYCSpider(scrapy.Spider)://创建爬虫继承类start_urls=[′http://www.zyctd.com/jiage/1-0-0.html′]//解析网页中中药材信息记录条的
item=ZYCItem()//item实例化//解析中药材“品名”
item[′name′]=each_zyc.xpath(′./span[1]/a/@title′).extract()[0]//解析中药材“规格”//解析中药材“市场”
item[′guig′]=each_zyc.xpath(′./span[2]/a/@title′).extract()[0]item[′sc′]=each_zyc.xpath(′./span[3]/@title′).extract()[0]//解析中药材“价格”//记录条总页数获取
item[′price′]=each_zyc.xpath(′./span[4]/text()′).extract()[0]yielditem//将实体传入管道文件处理
next_page_URL=response.xpath(′//*[@id=\"body\"]/section/div/div[3]/div[1]/div[3]/div
defparse(self,response)://response返回处理方法
zyc=response.xpath(′//*[@id=\"body\"]/section/div/div[3]/div[1]/div[2]/div/ul/li′)
[1]/div[8]/a/text()′).extract()[0]
next_page_URL=int(next_page_URL)//将总页数字串值转为整型foriinrange(2,next_page_URL+1)://字符串拼接构造下一页地址
URL=\"http://www.zyctd.com/jiage/1-0-0-\"+str(i)+\".html\"
其中name变量是所创建爬虫的名称,要确保其在整个项目中的唯一性;allowed_domains变量是整个项目将要访问的网络域名范围;start_urls变量是此爬虫启动后访问的第一个网络地址;parse方法是Scrapy的内置函数,作用是处理请求起始地址所返回的内容,也可作为后续URL访问返回的回调函数,通常在其中实现具体信息提取的解决方法。在此项目中使用Xpath解析器提取品名、规格、市场、最新完当前页面的目标内容后,通过yieldscrapy.Request(url=URL,callback=self.parse)语句实现下一页面的价格的具体内容。通过yield生成器将解析到item实体数据传递到管道中进行进一步的处理;当提取
yieldscrapy.Request(url=URL,callback=self.parse)//执行下一页请求
526江汉大学学报(自然科学版)总第46卷
请求,其中url参数传入的为下一页对应的URL地址,callback参数为处理请求返回内容的回调函数,因各页面目标内容的解析方法相同,在此仍使用parse作为回调函数;下一页的URL是通过在首页先通过[8]/a/text()′).extract()[0]语句获得页面总数后,在for循环中通过URL=\"http://www.zyctd.com/jiage/1-(i)的i变量为页数的值。
0-0-\"+str(i)+\".html\"语句进行字符串拼接得到相对于当前页的下一页URL地址,在此语句中的strnext_page_URL=response.xpath(′//*[@id=\"body\"]/section/div/div[3]/div[1]/div[3]/div[1]/div
在spider文件中获得目标信息实体后,传入到管道文件中进行保存。借助Python丰富的开源库,得到数据可选择多种存储方式,如简单的文本文件存储,JSON格式文件存储、数据库存储等。经实际测试发现将其保存为普通的文本文件存储效率较高,因此在设计中采用文本文件格式存储数据。为了方便后续导入Excel工具进行分析,数据存储格式如图4所示,将爬取到的每条信息的品名、规格、市场、价格以逗号分隔,各信息条之间换行存储。具体实现方法是在pipelines.py管道文件中通过open(\"文件名.txt\",′a′)asfp语名打开或创建文本文件,使用fp.write(item[′信息名′].encode(\"utf8\")+′,′)语名将爬取到的每条信息的品名、规格、市场、价格以逗号分隔,使用fp.write(item[′信息名′].encode(\"utf8\")+′\\n′)语名将各信息条之间换行存储。
图4Fig.4
数据存储格式Datastorageformat
3整体测试结果分析
在CPU为CORE(TM)i3-4160,内存为4G,操作系统为WIN7-SP1-位的宏基台式机环境下,在
CMD命令模式下通过“scrapycrawl–爬虫名”启动爬虫进行中药材信息采集测试,用时4.82s,爬取201页共计5013条中药材记录条,与网页实际记录条数相符,运行稳定。
为了考察网上数据与实地市场调研线下数据的一致性,借助Excel2010工具,将保存爬虫数据的
文本文件以逗号分格方式导入,转化为Excel2010表格,以名贵中药材西洋参、三七为例,利用Excel2010自带的折线图工具分别绘制各市场西洋参、三七不同规格的价格折线图。西洋参的价格折线图规格,其中长、短支又有加拿大、美国、国产之分别,安国、亳州、荷花池、玉林药市的相同规格的西洋参价格基本一致,其结果与线下实地市场调研结果基本相符。三七的价格折线图如图6所示,从图可知三七主要有20、40、60、80、120头春七、剪口春七、无数头春七等规格,其产地都源于云南,安国、亳州、荷花池、玉林药市的相同规格的三七价格也基本一致,同时可知三七的价格与头数成反比,20头春七价格最高,120头价格最低,其结果与线下实地市场调研结果基本相符,可见所爬取的数据可靠准确,可为后期的商品规格建立、价格预判的研究提供数据支撑。
如图5所示,从图5可知安国、亳州、荷花池、玉林药市西洋参主要有大片、短支、特大片、长支、中片等
4结语
本文以中药材天地为目标网站,基于Scrapy框架设计、在深入分析网页架构的基础上,设计编写爬
虫代码,经测试,所设计的爬虫实现了对亳州、安国、玉林、莲花池药市各类中药材品名、规格、价格等信息的快速采集。以线下实地调研数据为准绳,借助Excel2010工具,针对采集到的西洋参、三七两种
2018年第6期
张喜红,等:基于Scrapy的中药材网络信息采集方法研究527
图5
Fig.5
不同规格西洋参的价格
PriceofPanaxquinquefoliumofdifferentspecifications
图6
Fig.6
不同规格三七的价格
PriceofPanaxnotoginsengofdifferentspecifications
名贵中药材规格、价格信息进行分析,进一步证明所采集的线上数据与线下数据基本一致,可用于中药材商品规格等级及价格预测现状的研究。本文基于Scrapy框架设计的中药材价格信息收集系统虽然能够快速准确地获取相关信息,但代码的运行依赖于Python命令环境,对于非计算机专业人员使用而言略显不便。为了进一步拓展其使用人群,后续的研究中可为其拓展GUI界面操作功能。
参考文献(References)
[1]郭伟,余亚华.基于“大数据”的高校行政管理科学化研究[J].江汉大学学报(社会科学版),2018,35(1):108-[2]张侃.大数据时代网络突发事件的生成与处置机制创新[J].江汉大学学报(社会科学版),2016,33(4):60-63.[3]孙艺乘,张建敏.大数据数字媒体时代网络爬虫技术下的精准招商[J].贵州大学学报(自然科学版),2017,34
(2):66-69.
[4]李乔宇,尚明华,王富.基于Scrapy的农业网络数据爬取[J].山东农业科学,2017,20(7):127-129.[5]孙易冰,赵子东.一种基于网络爬虫技术的价格指数计算模型[J].统计研究,2014,20(10):74-80.[6]于娟,刘强.主题网络爬虫研究综述[J].计算机工程与科学,2015,37(2):231-237.
[7]彭纪奔,吴林,陈贤.基于爬虫技术的网络负面情绪挖掘系统设计与实现[J].计算机应用与软件,2016,21(1):[8]马联帅.基于Scrapy的分布式网络新闻抓取系统设计与实现[D].西安:西安电子科技大学,2015.
[9]杨君,陈春玲,余瀚.基于Scrapy技术的数据采集系统的设计与实现[J].计算机技术与发展,2018,16(5):3-8.[10]施威,夏斌.基于Scrapy的商品评价获取系统设计[J].微型机与应用,2017,36(19):12-16.
73-82.112.
(责任编辑:曾婷)
因篇幅问题不能全部显示,请点此查看更多更全内容