张喜红,王玉香
(亳州职业技术学院,安徽 亳州 236800)
中药材因其在治病救人、养生保健等方面的独特功效,长期以来受到人们的青睐,选用中药治病、保健的人数逐年上升,中医药产业也得到了前所未有的发展,中药材市场交易活跃。与此同时,伴随着互联网技术应用的推广,中药材信息相关的网站大量涌现,如中药材天地、中国药材市场等,中药材行业也逐步由传统的线下交易向网上电子交易转型,互联网上中药材相关的信息量日以万计增长,当前已积累了大量的数据。
大数据分析的相关案例一次又一次证实,数据的背后隐藏着重大的价值[1-2]。因此,收集、挖掘这些数据,为各类药材建立相应的规格标准及价格信息预警机制,防范价格的奇异波动,指导市场优质优价有序运营,进一步确保中药产业持续健康发展具有现实意义。然而互联网上中药材信息数据内容大多是基于页面形式,需要进一步采集梳理才能用于分析。如何准确、快速收集整理这些网络数据是开展研究的首要任务。通常“网络爬虫”是实现网络信息自动采集的手段,然而现行的网络爬虫工具在信息收集时针对性不强,无法满足聚焦爬取的要求。基于Python语言开发的Scrapy开源爬虫框架用于二次开发聚焦爬虫极其方便。如:孙艺乘等[3]基于Scrapy框架实现了精准招商系统;李乔宇等[4]基于Scrapy实现了山东玉米价格的预警分析系统。
基于上述背景,鉴于中药材天地网站药材信息健全、更新及时等优点,本文以中药材天地网站为爬取目标,基于Scrapy框架设计,实现了亳州、安国、玉林、莲花池等知名中药材市场的网络信息采集,并以西洋参、三七为例,考察了线上采集数据与线下实地调研的数据相符程度。
“网络爬虫”其本质是一段用于自动获取互联网网页的程序[5-6]。网络爬虫大致可分为通用和聚焦两种,通用网络爬虫主要以抓取整个互联网的资源为主,是搜索引擎的核心部件,其工作流程是从特定数目的起始网页URL开始,逐层抽取网页上的URL链接地址,并抓取网页,直至符合终止条件。聚焦爬虫以提取网站网页的特定信息为主,与通用爬虫相比,在组成结构上需增加相应的过滤规则。中药材信息采集系统是有针对性地提取网页页面中的信息,属于聚焦爬虫。在没有框架的基础上设计一个聚焦爬虫需解决网络联接、爬虫规则、数据存储等多方面的问题,开发过程相对复杂[7-8]。为了简化爬虫设计工作,市面上涌现出许多优秀的爬虫框架,其中最具代表性的框架是Scrapy框架。
Scrapy是一款基于Python语言编写的开源框架,其使用了twisted异步网络库来处理网络通讯,极大地提高了爬取效率[9-10]。Scrapy提供基础组件的同时还提供了自定义接口,兼具方便、灵活的特点。Scrapy框架的组件构成及工程目录结构如图1和图2所示,由引擎、调度器、下载器、爬虫、管道及一些中间组件构成。引擎组件是Scrapy的核心,其作用是管理整个Scrapy系统的数据流程及事务触发,在工程目录中的scrapy.cfg文件进行配置,开发者一般不需改动;调度器的主要作用是管理网页链接优先级及地址去重队列;下载器的作用是下载并传递网页内容到爬虫;爬虫组件在工程目录下的Spiders文件夹下创建,开发人员需在其中实现声明爬虫名、指定域名范围、设定起始地址及目标信息解析方法等内容,是二次开发设计的重点内容;管道与工程目录的pipeline.py文件相对应,通常用于实现数据的储存操作;工程目录下的items.py中主要用于定义目标信息的存储框架。
Scrapy工作步骤由如下5步循环执行,直到符合停止条件终止,具体过程是:①引擎请求调度器,获得目标页URL地址;②引擎把目标页URL地址打包成一个请求传递到下载器;③下载器收到请求后,下载目标页面,并返回应答到爬虫;④爬虫收到下载器返回的目标网页应答包后,采用设定的解析规则提取相应的item实体信息,并将item信息传入管道中;⑤管道对实体深度处理,如过滤、保存等。
图2 Scrapy框架的工程目录结构Fig.2 Engineering directory of Scrapy
中药材天地网市场价格栏目区按天更新亳州、安国、玉林、莲花池等知名中药材市场各类药材的价格信息,以其公布的信息作为研究数据极具代表性。市场价格栏目首页的域名是http://www.zyctd.com/jiage/1-0-0.html,当访问时返回如图3所示的布局结构,在信息条目版块分多页按行给出了每种药材的品名、规格、市场、最新价格等信息。利用浏览器的审查元素工具,分析各分页中的信息记录条对应的源码架构,可知每个分页中的信息记录条以多条
图3 中药材天地网市场价格栏目局部Fig.3 Local graph of market price for traditional Chinese medicinal materials on the Tiandi earth website
因信息记录条分页展示,所以爬取网页时还需获得各分页的URL,常规的做法是在每一页获取“下一页”按钮下的URL地址。实际解析发现:当处于不同的页数时,中药材天地网“下一页”按钮的URL地址所对应的XPath解析路径不同,不便于构造统一解析表达式。但是每个分页的URL地址具有一定的规律性,都是在首页地址的基础上追加“-页码”构成,且首页给出了最后一页的数值,因此在抽取分页URL地址时,通过循环语句将首页地址与对应的分页页码数进行字符串拼接获得,循环的次数通过提取首页给出的最后一页页码数获得。
搭建好Scrapy开发环境后,在CMD命令模式下通过scrapy startproject-项目名称命令创建Scrapy工程,首先在items.py文件中按“信息名=scrapy.Field()”格式定义品名、规格、市场、最新价格等信息对应的存储模板。在工程的spiders目录下创建爬虫Python文件,并编写爬虫代码。具体代码如下所示:
其中name变量是所创建爬虫的名称,要确保其在整个项目中的唯一性;allowed_domains变量是整个项目将要访问的网络域名范围;start_urls变量是此爬虫启动后访问的第一个网络地址;parse方法是Scrapy的内置函数,作用是处理请求起始地址所返回的内容,也可作为后续URL访问返回的回调函数,通常在其中实现具体信息提取的解决方法。在此项目中使用Xpath解析器提取品名、规格、市场、最新价格的具体内容。通过yield生成器将解析到item实体数据传递到管道中进行进一步的处理;当提取完当前页面的目标内容后,通过yield scrapy.Request(url=URL,callback=self.parse)语句实现下一页面的请求,其中url参数传入的为下一页对应的URL地址,callback参数为处理请求返回内容的回调函数,因各页面目标内容的解析方法相同,在此仍使用parse作为回调函数;下一页的URL是通过在首页先通过next_page_URL=response.xpath(′//*[@id="body"]/section /div /div[3]/div[1]/div[3]/div[1]/div[8]/a/text()′).extract()[0]语句获得页面总数后,在for循环中通过URL="http://www.zyctd.com/jiage/1-0-0-"+str(i)+".html"语句进行字符串拼接得到相对于当前页的下一页URL地址,在此语句中的str(i)的i变量为页数的值。
在spider文件中获得目标信息实体后,传入到管道文件中进行保存。借助Python丰富的开源库,得到数据可选择多种存储方式,如简单的文本文件存储,JSON格式文件存储、数据库存储等。经实际测试发现将其保存为普通的文本文件存储效率较高,因此在设计中采用文本文件格式存储数据。为了方便后续导入Excel工具进行分析,数据存储格式如图4所示,将爬取到的每条信息的品名、规格、市场、价格以逗号分隔,各信息条之间换行存储。具体实现方法是在pipelines.py管道文件中通过open("文件名.txt",′a′)as fp语名打开或创建文本文件,使用fp.write(item[′信息名′].encode("utf8")+ ′,′)语名将爬取到的每条信息的品名、规格、市场、价格以逗号分隔,使用fp.write(item[′信息名′].encode("utf8")+′ ′)语名将各信息条之间换行存储。
图4 数据存储格式Fig.4 Data storage format
在CPU为CORE(TM)i3-4160,内存为4G,操作系统为WIN7-SP1-64位的宏基台式机环境下,在CMD命令模式下通过“scrapy crawl–爬虫名”启动爬虫进行中药材信息采集测试,用时4.82 s,爬取201页共计5 013条中药材记录条,与网页实际记录条数相符,运行稳定。
为了考察网上数据与实地市场调研线下数据的一致性,借助Excel 2010工具,将保存爬虫数据的文本文件以逗号分格方式导入,转化为Excel 2010表格,以名贵中药材西洋参、三七为例,利用Excel 2010自带的折线图工具分别绘制各市场西洋参、三七不同规格的价格折线图。西洋参的价格折线图如图5所示,从图5可知安国、亳州、荷花池、玉林药市西洋参主要有大片、短支、特大片、长支、中片等规格,其中长、短支又有加拿大、美国、国产之分别,安国、亳州、荷花池、玉林药市的相同规格的西洋参价格基本一致,其结果与线下实地市场调研结果基本相符。三七的价格折线图如图6所示,从图可知三七主要有20、40、60、80、120头春七、剪口春七、无数头春七等规格,其产地都源于云南,安国、亳州、荷花池、玉林药市的相同规格的三七价格也基本一致,同时可知三七的价格与头数成反比,20头春七价格最高,120头价格最低,其结果与线下实地市场调研结果基本相符,可见所爬取的数据可靠准确,可为后期的商品规格建立、价格预判的研究提供数据支撑。
图5 不同规格西洋参的价格Fig.5 Price of Panax quinquefoliumof different specifications
图6 不同规格三七的价格Fig.6 Price of Panax notoginsengof different specifications
本文以中药材天地为目标网站,基于Scrapy框架设计、在深入分析网页架构的基础上,设计编写爬虫代码,经测试,所设计的爬虫实现了对亳州、安国、玉林、莲花池药市各类中药材品名、规格、价格等信息的快速采集。以线下实地调研数据为准绳,借助Excel 2010工具,针对采集到的西洋参、三七两种名贵中药材规格、价格信息进行分析,进一步证明所采集的线上数据与线下数据基本一致,可用于中药材商品规格等级及价格预测现状的研究。本文基于Scrapy框架设计的中药材价格信息收集系统虽然能够快速准确地获取相关信息,但代码的运行依赖于Python命令环境,对于非计算机专业人员使用而言略显不便。为了进一步拓展其使用人群,后续的研究中可为其拓展GUI界面操作功能。