2019年03月
第36卷第2期
枣庄学院学报
JOURNAL OF ZAOZHUANG UNIVERSITY
M ar.2019
Vol.36 NO.2
基于Python的中药材价格信息爬虫的设计
张喜红
(亳州职业技术学院智能工程系,安徽亳州236800)
[摘要]为了收集大量、真实、可靠的中药材价格信息,为中药材价格的预测研究提供强有力的数据支撑。将数据来源方向瞄向互联网,在前期筛选的基础上,最终确立以中药材天地网为目标网站。在深人分析目标网站结构的基础上,基于Python语言设计了一款中药材价格信息爬虫。详细介绍了爬虫模拟请求网页、
目标信息提取、信息存储及定时启动部署等环节的实现方法。实际测试结果显示,所设计的爬虫运行稳定,能高效、完整无误的抓取目标网站的信息条目。
[关键词]P y th on;中药材;爬虫①
[中图分类号]TP391 [文献标识码]A [文章编号]1004 - 7077 ( 2019 ) 02 - 0067 - 06 0引言
伴随着大数据时代的快速到来,人们越来越倾向于借助数据揭示事物内在规律,进而指导决 策[1_2].因此,如何利用大数据做好中药材价格走势的及时预测,为中药材市场运营决策提供支撑,促进市场有序运营,极具研究意义.目前对于价格推测、分析的方法主要有两类,其一是基于影响 价格变化因素采用特定的技术方法进行推理;其二是基于历史数据的推理法.因素法由于影响因子 多维善变、因子权重难于确定等原因,难于建模;时间序列分析是一种基于历史价格数据的变化规 律预测未来价格走势的方法,是当前价格预测的主流方法之一.时间序列分析法实施的难点在于如 何获取足够多且相对完整的历史价格数据[3].
互联网技术自诞生以来,在各行业得到了广泛的应用,互联网在中医、中药领域的应用也达到 了前所未有的广度,积累了相当丰厚的网络数据资源.如中药材天地网就积累了相当数量的中药材 价格信息,为时间序列分析法提供了强有力的数据支撑.然而,如何从网络上快速、高效的收集这 些数据,并将其整理为便于分析的结构化数据,是极为关键的一步.网络爬虫是收集、提取网络数 据的主流技术手段[4_5].
基于上述背景,为了满足基于时间序列分析法开展中药材价格预测研究的数据需求,鉴于P y­thon语言在爬虫设计方面具有程序简洁、资源丰富、便于实现等优点,本文以 中药材天地网为目标 网站,基于P y t h o n语言设计了一款用于中药材价格信息收集的网络爬虫,采用Requests模块实现网 页的H t t p请求,采用Beautifulsoup实现了目标信息的过滤、解析、提取,最终将目标数据保存为便 于分析的结构化文本文件数据,同时就爬虫的定时启动、抓取进行了介绍.
1爬虫的原理分析
从互联网获取相关信息,最直接的方法是通过浏览器输人U R L向服务器发起H t t p请求,请求
①[收稿日期]2018-11-30
[基金项目]安徽省高校优秀青年人才支持计划项目(gxyq2018215);安徽省高校自然科学研究重大项目(KJ2016SD41).
[作者简介]张喜红( 1983 -),男(汉族),山西朔州人,亳州职业技术学院讲师,工学硕士,山东大学访问学者,主要 从事计算机技术及应用方面的研究.
• 67 •
率庄学院学报2019年第2期
成功后服务器返回一个包含目标网页内容的R e s p o n s e ,经浏览器解析后呈现给用户.如果用户想统 计、收集某个网站成千上万条的信息记录条,若以浏览器人工访问网页的方式进行,不仅效率低下 且易出错[6].基于此,爬虫的概念便诞生了,爬虫通俗来讲是一段实现自动访问网页,并自动定向 提取网页中目标信息的程序.网络爬虫典型的工作流程大致包含如下几个步骤:①模拟或自动调用 网页浏览器发送请求并获取网页源码;如在P y t h o n 中可使用R e q u e s t 库的相关方法向服务器发起模 拟请求,待响应成功后,将返回一个包含多种媒体格式的Response .②过滤、提取网页源码中包含 的目标信息;即从网页源码中通过X P a t h 、正则表达式或Beautifulsoup 等模块的相应方法,定位、 提取目标信息.③将提取的目标信息存储;保存形式多样化,可以保存成文本,也可以保存至数据 库,或者保存成特定格式的文件.
2中药材价格信息爬虫的设计与实现
2.1目标网页的分析
中药材天地网自建站以来,其市场价格栏目每天实时公布亳州、安国、玉林及荷花池4个药市
数百种中药材的规格与价格信息,且其公布的中药材价格数据真实可靠,为中药材价格走势的预测 提供了真实、可靠的源数据.在网页浏览器中输人药材价格栏目的首页U
R L
地址:http : //
W W W . zyctd . com /jiage /1 -0 -0. htm l ,可得到图1所本的页面,在页面的价格信息区按品名、规格、
市场、当前价格等题头逐行呈现中药材的价格信息,且分多页显示,在页面的底部给出了分页链接 信息.根据上述分析可知,在爬虫的设计过程中,需要解决如下问题:①获取各个分页的U R L 链接 地址;②提取各分页信息记录条的目标信息.
三七 黄连 党参 丹参 黄芪 金锒花 人参 白及 白术 连翘
价格信息条目
品名规格市场 1t
近期价格
走势周涨跌
月涨跌
年涨跌
价格图
石见穿统河南毫州9.00平20%
20%80%红杲天小花统西藏玉林37.00平19.35%32. 14%32. 14%地榆
统片较广
荷花迪
10.50
16.67%
16.67%
16.67%
(a ) 价格信息区顶部片断
红杲天 大花统西藏 安国 45.00平 T. 14*红杲天
大花统西藏
玉林
45.00平
T.141S
分页索引------------------------上一页
1
2
3
4
5
(b ) 价格信息区底部片断
图1
中药材天地网市场价格栏目局部
2.2目标信息的获取
如前面所述爬虫要想从网页中提取信息,首先需将网页源码下载到本地,网页源码的下载通过
18. 42%15.38%12.5%
21.62%
201
下一页页
• 68 •
Http请求实现,Requests模块是Python语言开发的Http库,其功能强大,实现简单[7_9].对于采用 GET方式打开的网页,可采用语句requests,get (“URL地址参数”).text方法模拟请求,得到网页 源后将其存储为文本格式.同时BeautifulSoup是基于Python语言开发的一个用于解析html对象的第 三方库.对于结构化网页信息的提取,与正则表达式相比更具优势.其提供的fmd ()与fincL all ()方法使信息定位、过滤、提取的实现更加简单[1°_13].同时考虑到中药材天地网结构规范,且要
提取的目标信息都是文本字段,最终决定采用Requests模块进行模拟Http请求下载目标网页源码, 采用BeautifulSoup模块过滤、解析、提取目标信息.
借助浏览器的审查元素工具,分析各页中的源码架构,如图2所示,每页中的每条信息记录条 处于同一 < ul class= ”priceTableRows”>标签下,并以多个< li>标记有序分隔,其中每条信息要 提取的品名、规格、市场、价格四项信息分别处于相应< li>标记下的< span class= ”wl”>、< span class= ”w2”>、< span class= ”w9”>、< span class= ”w3”> 标签•因此,运用 Beauti­fulSoup模块提供的 find () 与find_ all () 方法可很方便的实现 目标信息的过滤提取 •具体实现代 码如下:
def get_ page_ values (self,now_ url):# 其中 now_ url参数为网页的 URL地址
now_ html= requests,get (now_ url) .text#下载网页源码,并以文本方式储存
now_ Soup = BeautifulSoup (now_ html,# 以网页文档解析源码
all_ value一li= now_ Soup,find (div’,class_ = |)riceTable’)•find_ all (li’)#定位所有
<li>标签的内容
for tag in all_ value_ li:#遍历所有<li>标签下的内容
name= tag.find (span^,class_ = W) .get一text ( ) •encode (titf- 8 ’)
#提取“品名”
guige= tag.find (备pan' class一= W) •get_ text ( ). encode (titf- 8')
#提取“规格”
shichang= tag.find (备pany,class一= .get_ text ( ) .encode (litf-8〇
#提取“市场”
price= tag.find (备pan’,class一=%3〇 .get_ text ( ) .encode (litf-8^)
#提取“价格”
self.write_ txt (name,guige,shichang,price)#将目标信息存入文件
__________________________________张喜红基于Python的中药材价格信息爬虫的设计__________________________________ r<ul cla5S= ''priceTableRows">
▼<li class〉
▼<span cla5s='f w l,,>
<a h r e f=1h t t o s://i^jw.z v c t d.cQfn/i h987.h tm l1•t i t l e:卜石见穿't a r g e t:■,一b lank
</sp a n> ,
▼<span cla55=,l w2,,> 市场
<a h「ef=litT:is://u v A V.=../ct:d.cQ iri/ii5ge/xa937.htfnr title
</span> 价格i~I
<5pan clgss="w9"_titlei='毫州1丨毫州丨/span>品名
石见穿/a>
'统河南"t s「g e t= _b la n k n)■统河南彳/a>
span cl35S=,,w3',[9i02i J r span>'
span cla5s="w4">ip</5pan:>
规格
图2价格信息条的源码片断
• 69 *
赛庄学院学报2019年第2期
2.3分页面信息的获取
通过浏览器查看各个分页的U R L地址可知:各分页的U R L地址是由首页U R L地址加一个 “一”与分页号构成,如:首页的U R L地址为:w d.c o m/jiage/l-0-0.h t m l,第 201 页的 U R L地址为:w d.c o m/jiage/1 -0-0-201.html.如图 1 (b)所系,首页底部 的分页链接按钮给出了分
页面的总数,如当前一共有201个页面.通过审查元素工具,可知分页总 数位于<divclass= pageBreak>标签内容中的第5个<a>标签中•因此可对分页的访问下载做如 下设计:①先通过首页U R L地址发起H T T P请求,提取首页内容中包含的分页总数信息;②以分页 面总数为上限,构造主循环,以首页地址与当前循环次数进行字串拼接得到各分页的U R L地址,并逐次请求下载各分页源码.具体实现代码如下:
python正则表达式爬虫
defget_ a!I_ page_ values (self):#获取所有分页面中记录条信息
#下载首页源码
html= requests,get (http://w d.c o m/jiage/1 -0-0. html^) .text
#以网页解析文档
Soup= BeautifulSoup (htm l,I x m r)
#定位到最后一页的页码值对应的标签区
all一l i= So u p,find (div',class一= ^ageBreak’).find一all (红’)
#提取最后一页的页码值,#获取最大页码值,即页面总数
Page_ m a x= int (all_ l i [4 ] .get_ text ())
all一page一value=[]
for i in range ( 1, Page一m a x+ 1 ):
if i= = 1:
#为1时是首页,U R L地址较特殊
te m p_ url= http://w d.c o m/jiage/1 -0-0. html^else:
#字串拼接枸造分页U R L地址
te m p一url= w d.c o m/jiage/1 s tr(i)+ C html, #调用页面目标信息提取函数,获取当前分页中所有记录条的品名、规格、市场、价格等目标信息
n o w一page= _ values (t e m p_ url)
all一page一value,extend (n o w一page)
result一df = p d.DataFrame (all一page一value)
retumresult一df
2.4目标数据的存储
鉴于文本文件的通用性较好,且便于后期的跨平台分析,文中将提取到的目标数据采用文本文 件进行存储.为了便于后期按分隔符导入表格文件,在写入文本文件时,一条记录条的品名、规 格、市场及价格之间采用逗号分隔,各条记录条间采用回车进行分隔.同时考虑到中药材天地网的 价格信息是按天发布,为了避免信息的重复,在每天爬取数据时,以当前系统日期为文件名创建文 件,当前系统日期的获取通过P y t h o n的datetime模块中的datetime,n o w ().date ().isoformat ()实现.详细实现代码如下:
def write一txt (self,n a m e,guige,shichang,price):
#以当前系统日期为文件名创建本次存储文件
file_ n a m e= str (self.path_ )+/’+ datetime,n o w ( ) .date () .isoformat ( )+ C txt^
with open (file_ n a m e,a')as f:
• 70 •
张喜红基于Python的中药材价格信息爬虫的设计
:f.write (n a m e)#品名
£ write ( ',〇号分隔
t write (guige)#规格
f.write (',’)号分隔
f.write (shichang)#市场
f.write (',’)号分隔
f.write (price)#价格
f.write (八n〇 #不同记录条间“回车”分隔
3爬虫的部署与运行测试
中药材天地网按天更新各药材价格信息,因此需每天运行爬虫,更新的价格进行采集,如果 爬虫每天的启动工作由用户人工完成,事必增加了用户的工作事项,多有不便.倘若有一天用户忘 记了此项任务,将会导致当天信息缺失.考虑到当前用户电脑以w i n d o w s系统为主流,同时windows 系统自带任务计
划程序安排功能,因此采用w i n d o w s自带的任务计划来实现爬虫的定时启动.以 W i n7系统为例,具体的部署方法是:①创建b a t批处理文件,在文件中书写如:“p y t h o n爬虫文件 名.p y”格式的命令;②依次进人系统“控制面板”/ “管理工具”/ “任务计划程序”/ “创建任 务”栏目,创建一个每天指定时间启动①中批处理文件的新任务;③在“任务计划程序”任务安排 列表中选中②中创建的新任务,并点选“运行”按钮启动.
将所设计的爬虫按照上述方法,部署到C P U型号为Intel (R)Core (T M)i3 -4160 3.6G H z,内存为4G B,操作系统为W i n7-64位的平台上,对目标网页进行信息爬取,得到如图3所示的目标 信息,此次测试运行共计收集201页20051条记录,用时约1026毫秒.经人工与网页实际数据对比,信息记录条数一致,无重复,无缺项.进一步证实,所设计的爬虫运行效率较高,准确无误, 可用于中药材价格数据的收集.
- \m£^i Run m y_pachong_gui
:ieshm)
荜妾,统#口,毫州,26. 00
窗^1统技』工1安圓,120.0。
弁麼,女国,23. 〇〇_芦,统余北,晕州,19.00
f e r,s t H,i s o.o o
昂_鸾1中f t统廷码玉林
, 350.00
酉赛枣t, fl选邊黃山茔nl'i'L 24〇. 〇〇_枣£,机选统佘山1玉沐24〇_00
(a)生成文本文件的片断
□□
200178.00
20018金钱草
20019小叶全草四川
20050 毫州
320051 7.5C|
(b )pycharm运行过程的片断
图3目标信息片断
4结论
本文以中药材价格预测的研究为背景,为了收集大量的中药材价格数据,瞄准互联网上的数据 资源,以中药材天地网为目标网站,在深入分析其网页布局结构及信息发布规则的基础上,基于 P y t h o n语言的Requests、Beautifulsoup等模块,设计了一款中药材价格信息爬虫,同时就爬虫在win­dows系统如何实现定时 自动运行的部署进行了介绍.经实验测试 ,所设计的爬虫运行可靠、效率较 高,所得数据与网页公布一致无误,为从互联网收集中药材相关信息提供了参考方法.虽然所设计
• 71 •