張喜紅,王玉香
(亳州職業(yè)技術(shù)學(xué)院,安徽 亳州 236800)
中藥材因其在治病救人、養(yǎng)生保健等方面的獨(dú)特功效,長(zhǎng)期以來(lái)受到人們的青睞,選用中藥治病、保健的人數(shù)逐年上升,中醫(yī)藥產(chǎn)業(yè)也得到了前所未有的發(fā)展,中藥材市場(chǎng)交易活躍。與此同時(shí),伴隨著互聯(lián)網(wǎng)技術(shù)應(yīng)用的推廣,中藥材信息相關(guān)的網(wǎng)站大量涌現(xiàn),如中藥材天地、中國(guó)藥材市場(chǎng)等,中藥材行業(yè)也逐步由傳統(tǒng)的線下交易向網(wǎng)上電子交易轉(zhuǎn)型,互聯(lián)網(wǎng)上中藥材相關(guān)的信息量日以萬(wàn)計(jì)增長(zhǎng),當(dāng)前已積累了大量的數(shù)據(jù)。
大數(shù)據(jù)分析的相關(guān)案例一次又一次證實(shí),數(shù)據(jù)的背后隱藏著重大的價(jià)值[1-2]。因此,收集、挖掘這些數(shù)據(jù),為各類藥材建立相應(yīng)的規(guī)格標(biāo)準(zhǔn)及價(jià)格信息預(yù)警機(jī)制,防范價(jià)格的奇異波動(dòng),指導(dǎo)市場(chǎng)優(yōu)質(zhì)優(yōu)價(jià)有序運(yùn)營(yíng),進(jìn)一步確保中藥產(chǎn)業(yè)持續(xù)健康發(fā)展具有現(xiàn)實(shí)意義。然而互聯(lián)網(wǎng)上中藥材信息數(shù)據(jù)內(nèi)容大多是基于頁(yè)面形式,需要進(jìn)一步采集梳理才能用于分析。如何準(zhǔn)確、快速收集整理這些網(wǎng)絡(luò)數(shù)據(jù)是開(kāi)展研究的首要任務(wù)。通常“網(wǎng)絡(luò)爬蟲(chóng)”是實(shí)現(xiàn)網(wǎng)絡(luò)信息自動(dòng)采集的手段,然而現(xiàn)行的網(wǎng)絡(luò)爬蟲(chóng)工具在信息收集時(shí)針對(duì)性不強(qiáng),無(wú)法滿足聚焦爬取的要求。基于Python語(yǔ)言開(kāi)發(fā)的Scrapy開(kāi)源爬蟲(chóng)框架用于二次開(kāi)發(fā)聚焦爬蟲(chóng)極其方便。如:孫藝乘等[3]基于Scrapy框架實(shí)現(xiàn)了精準(zhǔn)招商系統(tǒng);李喬宇等[4]基于Scrapy實(shí)現(xiàn)了山東玉米價(jià)格的預(yù)警分析系統(tǒng)。
基于上述背景,鑒于中藥材天地網(wǎng)站藥材信息健全、更新及時(shí)等優(yōu)點(diǎn),本文以中藥材天地網(wǎng)站為爬取目標(biāo),基于Scrapy框架設(shè)計(jì),實(shí)現(xiàn)了亳州、安國(guó)、玉林、蓮花池等知名中藥材市場(chǎng)的網(wǎng)絡(luò)信息采集,并以西洋參、三七為例,考察了線上采集數(shù)據(jù)與線下實(shí)地調(diào)研的數(shù)據(jù)相符程度。
“網(wǎng)絡(luò)爬蟲(chóng)”其本質(zhì)是一段用于自動(dòng)獲取互聯(lián)網(wǎng)網(wǎng)頁(yè)的程序[5-6]。網(wǎng)絡(luò)爬蟲(chóng)大致可分為通用和聚焦兩種,通用網(wǎng)絡(luò)爬蟲(chóng)主要以抓取整個(gè)互聯(lián)網(wǎng)的資源為主,是搜索引擎的核心部件,其工作流程是從特定數(shù)目的起始網(wǎng)頁(yè)URL開(kāi)始,逐層抽取網(wǎng)頁(yè)上的URL鏈接地址,并抓取網(wǎng)頁(yè),直至符合終止條件。聚焦爬蟲(chóng)以提取網(wǎng)站網(wǎng)頁(yè)的特定信息為主,與通用爬蟲(chóng)相比,在組成結(jié)構(gòu)上需增加相應(yīng)的過(guò)濾規(guī)則。中藥材信息采集系統(tǒng)是有針對(duì)性地提取網(wǎng)頁(yè)頁(yè)面中的信息,屬于聚焦爬蟲(chóng)。在沒(méi)有框架的基礎(chǔ)上設(shè)計(jì)一個(gè)聚焦爬蟲(chóng)需解決網(wǎng)絡(luò)聯(lián)接、爬蟲(chóng)規(guī)則、數(shù)據(jù)存儲(chǔ)等多方面的問(wèn)題,開(kāi)發(fā)過(guò)程相對(duì)復(fù)雜[7-8]。為了簡(jiǎn)化爬蟲(chóng)設(shè)計(jì)工作,市面上涌現(xiàn)出許多優(yōu)秀的爬蟲(chóng)框架,其中最具代表性的框架是Scrapy框架。
Scrapy是一款基于Python語(yǔ)言編寫(xiě)的開(kāi)源框架,其使用了twisted異步網(wǎng)絡(luò)庫(kù)來(lái)處理網(wǎng)絡(luò)通訊,極大地提高了爬取效率[9-10]。Scrapy提供基礎(chǔ)組件的同時(shí)還提供了自定義接口,兼具方便、靈活的特點(diǎn)。Scrapy框架的組件構(gòu)成及工程目錄結(jié)構(gòu)如圖1和圖2所示,由引擎、調(diào)度器、下載器、爬蟲(chóng)、管道及一些中間組件構(gòu)成。引擎組件是Scrapy的核心,其作用是管理整個(gè)Scrapy系統(tǒng)的數(shù)據(jù)流程及事務(wù)觸發(fā),在工程目錄中的scrapy.cfg文件進(jìn)行配置,開(kāi)發(fā)者一般不需改動(dòng);調(diào)度器的主要作用是管理網(wǎng)頁(yè)鏈接優(yōu)先級(jí)及地址去重隊(duì)列;下載器的作用是下載并傳遞網(wǎng)頁(yè)內(nèi)容到爬蟲(chóng);爬蟲(chóng)組件在工程目錄下的Spiders文件夾下創(chuàng)建,開(kāi)發(fā)人員需在其中實(shí)現(xiàn)聲明爬蟲(chóng)名、指定域名范圍、設(shè)定起始地址及目標(biāo)信息解析方法等內(nèi)容,是二次開(kāi)發(fā)設(shè)計(jì)的重點(diǎn)內(nèi)容;管道與工程目錄的pipeline.py文件相對(duì)應(yīng),通常用于實(shí)現(xiàn)數(shù)據(jù)的儲(chǔ)存操作;工程目錄下的items.py中主要用于定義目標(biāo)信息的存儲(chǔ)框架。
Scrapy工作步驟由如下5步循環(huán)執(zhí)行,直到符合停止條件終止,具體過(guò)程是:①引擎請(qǐng)求調(diào)度器,獲得目標(biāo)頁(yè)URL地址;②引擎把目標(biāo)頁(yè)URL地址打包成一個(gè)請(qǐng)求傳遞到下載器;③下載器收到請(qǐng)求后,下載目標(biāo)頁(yè)面,并返回應(yīng)答到爬蟲(chóng);④爬蟲(chóng)收到下載器返回的目標(biāo)網(wǎng)頁(yè)應(yīng)答包后,采用設(shè)定的解析規(guī)則提取相應(yīng)的item實(shí)體信息,并將item信息傳入管道中;⑤管道對(duì)實(shí)體深度處理,如過(guò)濾、保存等。
圖2 Scrapy框架的工程目錄結(jié)構(gòu)Fig.2 Engineering directory of Scrapy
中藥材天地網(wǎng)市場(chǎng)價(jià)格欄目區(qū)按天更新亳州、安國(guó)、玉林、蓮花池等知名中藥材市場(chǎng)各類藥材的價(jià)格信息,以其公布的信息作為研究數(shù)據(jù)極具代表性。市場(chǎng)價(jià)格欄目首頁(yè)的域名是http://www.zyctd.com/jiage/1-0-0.html,當(dāng)訪問(wèn)時(shí)返回如圖3所示的布局結(jié)構(gòu),在信息條目版塊分多頁(yè)按行給出了每種藥材的品名、規(guī)格、市場(chǎng)、最新價(jià)格等信息。利用瀏覽器的審查元素工具,分析各分頁(yè)中的信息記錄條對(duì)應(yīng)的源碼架構(gòu),可知每個(gè)分頁(yè)中的信息記錄條以多條
圖3 中藥材天地網(wǎng)市場(chǎng)價(jià)格欄目局部Fig.3 Local graph of market price for traditional Chinese medicinal materials on the Tiandi earth website
因信息記錄條分頁(yè)展示,所以爬取網(wǎng)頁(yè)時(shí)還需獲得各分頁(yè)的URL,常規(guī)的做法是在每一頁(yè)獲取“下一頁(yè)”按鈕下的URL地址。實(shí)際解析發(fā)現(xiàn):當(dāng)處于不同的頁(yè)數(shù)時(shí),中藥材天地網(wǎng)“下一頁(yè)”按鈕的URL地址所對(duì)應(yīng)的XPath解析路徑不同,不便于構(gòu)造統(tǒng)一解析表達(dá)式。但是每個(gè)分頁(yè)的URL地址具有一定的規(guī)律性,都是在首頁(yè)地址的基礎(chǔ)上追加“-頁(yè)碼”構(gòu)成,且首頁(yè)給出了最后一頁(yè)的數(shù)值,因此在抽取分頁(yè)URL地址時(shí),通過(guò)循環(huán)語(yǔ)句將首頁(yè)地址與對(duì)應(yīng)的分頁(yè)頁(yè)碼數(shù)進(jìn)行字符串拼接獲得,循環(huán)的次數(shù)通過(guò)提取首頁(yè)給出的最后一頁(yè)頁(yè)碼數(shù)獲得。
搭建好Scrapy開(kāi)發(fā)環(huán)境后,在CMD命令模式下通過(guò)scrapy startproject-項(xiàng)目名稱命令創(chuàng)建Scrapy工程,首先在items.py文件中按“信息名=scrapy.Field()”格式定義品名、規(guī)格、市場(chǎng)、最新價(jià)格等信息對(duì)應(yīng)的存儲(chǔ)模板。在工程的spiders目錄下創(chuàng)建爬蟲(chóng)Python文件,并編寫(xiě)爬蟲(chóng)代碼。具體代碼如下所示:
其中name變量是所創(chuàng)建爬蟲(chóng)的名稱,要確保其在整個(gè)項(xiàng)目中的唯一性;allowed_domains變量是整個(gè)項(xiàng)目將要訪問(wèn)的網(wǎng)絡(luò)域名范圍;start_urls變量是此爬蟲(chóng)啟動(dòng)后訪問(wèn)的第一個(gè)網(wǎng)絡(luò)地址;parse方法是Scrapy的內(nèi)置函數(shù),作用是處理請(qǐng)求起始地址所返回的內(nèi)容,也可作為后續(xù)URL訪問(wèn)返回的回調(diào)函數(shù),通常在其中實(shí)現(xiàn)具體信息提取的解決方法。在此項(xiàng)目中使用Xpath解析器提取品名、規(guī)格、市場(chǎng)、最新價(jià)格的具體內(nèi)容。通過(guò)yield生成器將解析到item實(shí)體數(shù)據(jù)傳遞到管道中進(jìn)行進(jìn)一步的處理;當(dāng)提取完當(dāng)前頁(yè)面的目標(biāo)內(nèi)容后,通過(guò)yield scrapy.Request(url=URL,callback=self.parse)語(yǔ)句實(shí)現(xiàn)下一頁(yè)面的請(qǐng)求,其中url參數(shù)傳入的為下一頁(yè)對(duì)應(yīng)的URL地址,callback參數(shù)為處理請(qǐng)求返回內(nèi)容的回調(diào)函數(shù),因各頁(yè)面目標(biāo)內(nèi)容的解析方法相同,在此仍使用parse作為回調(diào)函數(shù);下一頁(yè)的URL是通過(guò)在首頁(yè)先通過(guò)next_page_URL=response.xpath(′//*[@id="body"]/section /div /div[3]/div[1]/div[3]/div[1]/div[8]/a/text()′).extract()[0]語(yǔ)句獲得頁(yè)面總數(shù)后,在for循環(huán)中通過(guò)URL="http://www.zyctd.com/jiage/1-0-0-"+str(i)+".html"語(yǔ)句進(jìn)行字符串拼接得到相對(duì)于當(dāng)前頁(yè)的下一頁(yè)URL地址,在此語(yǔ)句中的str(i)的i變量為頁(yè)數(shù)的值。
在spider文件中獲得目標(biāo)信息實(shí)體后,傳入到管道文件中進(jìn)行保存。借助Python豐富的開(kāi)源庫(kù),得到數(shù)據(jù)可選擇多種存儲(chǔ)方式,如簡(jiǎn)單的文本文件存儲(chǔ),JSON格式文件存儲(chǔ)、數(shù)據(jù)庫(kù)存儲(chǔ)等。經(jīng)實(shí)際測(cè)試發(fā)現(xiàn)將其保存為普通的文本文件存儲(chǔ)效率較高,因此在設(shè)計(jì)中采用文本文件格式存儲(chǔ)數(shù)據(jù)。為了方便后續(xù)導(dǎo)入Excel工具進(jìn)行分析,數(shù)據(jù)存儲(chǔ)格式如圖4所示,將爬取到的每條信息的品名、規(guī)格、市場(chǎng)、價(jià)格以逗號(hào)分隔,各信息條之間換行存儲(chǔ)。具體實(shí)現(xiàn)方法是在pipelines.py管道文件中通過(guò)open("文件名.txt",′a′)as fp語(yǔ)名打開(kāi)或創(chuàng)建文本文件,使用fp.write(item[′信息名′].encode("utf8")+ ′,′)語(yǔ)名將爬取到的每條信息的品名、規(guī)格、市場(chǎng)、價(jià)格以逗號(hào)分隔,使用fp.write(item[′信息名′].encode("utf8")+′ ′)語(yǔ)名將各信息條之間換行存儲(chǔ)。
圖4 數(shù)據(jù)存儲(chǔ)格式Fig.4 Data storage format
在CPU為CORE(TM)i3-4160,內(nèi)存為4G,操作系統(tǒng)為WIN7-SP1-64位的宏基臺(tái)式機(jī)環(huán)境下,在CMD命令模式下通過(guò)“scrapy crawl–爬蟲(chóng)名”啟動(dòng)爬蟲(chóng)進(jìn)行中藥材信息采集測(cè)試,用時(shí)4.82 s,爬取201頁(yè)共計(jì)5 013條中藥材記錄條,與網(wǎng)頁(yè)實(shí)際記錄條數(shù)相符,運(yùn)行穩(wěn)定。
為了考察網(wǎng)上數(shù)據(jù)與實(shí)地市場(chǎng)調(diào)研線下數(shù)據(jù)的一致性,借助Excel 2010工具,將保存爬蟲(chóng)數(shù)據(jù)的文本文件以逗號(hào)分格方式導(dǎo)入,轉(zhuǎn)化為Excel 2010表格,以名貴中藥材西洋參、三七為例,利用Excel 2010自帶的折線圖工具分別繪制各市場(chǎng)西洋參、三七不同規(guī)格的價(jià)格折線圖。西洋參的價(jià)格折線圖如圖5所示,從圖5可知安國(guó)、亳州、荷花池、玉林藥市西洋參主要有大片、短支、特大片、長(zhǎng)支、中片等規(guī)格,其中長(zhǎng)、短支又有加拿大、美國(guó)、國(guó)產(chǎn)之分別,安國(guó)、亳州、荷花池、玉林藥市的相同規(guī)格的西洋參價(jià)格基本一致,其結(jié)果與線下實(shí)地市場(chǎng)調(diào)研結(jié)果基本相符。三七的價(jià)格折線圖如圖6所示,從圖可知三七主要有20、40、60、80、120頭春七、剪口春七、無(wú)數(shù)頭春七等規(guī)格,其產(chǎn)地都源于云南,安國(guó)、亳州、荷花池、玉林藥市的相同規(guī)格的三七價(jià)格也基本一致,同時(shí)可知三七的價(jià)格與頭數(shù)成反比,20頭春七價(jià)格最高,120頭價(jià)格最低,其結(jié)果與線下實(shí)地市場(chǎng)調(diào)研結(jié)果基本相符,可見(jiàn)所爬取的數(shù)據(jù)可靠準(zhǔn)確,可為后期的商品規(guī)格建立、價(jià)格預(yù)判的研究提供數(shù)據(jù)支撐。
圖5 不同規(guī)格西洋參的價(jià)格Fig.5 Price of Panax quinquefoliumof different specifications
圖6 不同規(guī)格三七的價(jià)格Fig.6 Price of Panax notoginsengof different specifications
本文以中藥材天地為目標(biāo)網(wǎng)站,基于Scrapy框架設(shè)計(jì)、在深入分析網(wǎng)頁(yè)架構(gòu)的基礎(chǔ)上,設(shè)計(jì)編寫(xiě)爬蟲(chóng)代碼,經(jīng)測(cè)試,所設(shè)計(jì)的爬蟲(chóng)實(shí)現(xiàn)了對(duì)亳州、安國(guó)、玉林、蓮花池藥市各類中藥材品名、規(guī)格、價(jià)格等信息的快速采集。以線下實(shí)地調(diào)研數(shù)據(jù)為準(zhǔn)繩,借助Excel 2010工具,針對(duì)采集到的西洋參、三七兩種名貴中藥材規(guī)格、價(jià)格信息進(jìn)行分析,進(jìn)一步證明所采集的線上數(shù)據(jù)與線下數(shù)據(jù)基本一致,可用于中藥材商品規(guī)格等級(jí)及價(jià)格預(yù)測(cè)現(xiàn)狀的研究。本文基于Scrapy框架設(shè)計(jì)的中藥材價(jià)格信息收集系統(tǒng)雖然能夠快速準(zhǔn)確地獲取相關(guān)信息,但代碼的運(yùn)行依賴于Python命令環(huán)境,對(duì)于非計(jì)算機(jī)專業(yè)人員使用而言略顯不便。為了進(jìn)一步拓展其使用人群,后續(xù)的研究中可為其拓展GUI界面操作功能。