李喬宇+尚明華+王富軍+劉淑云
摘要:準確、及時、高效地獲取農(nóng)業(yè)數(shù)據(jù)是全產(chǎn)業(yè)鏈農(nóng)業(yè)信息分析預警工作的前提和基礎,是提升農(nóng)業(yè)信息分析預警專業(yè)化和規(guī)范化水平的關鍵。本研究針對互聯(lián)網(wǎng)中存在的大量農(nóng)業(yè)信息數(shù)據(jù),以玉米價格數(shù)據(jù)為例,設計數(shù)據(jù)抓取和規(guī)范化存儲策略,首先基于Scrapy框架建立對網(wǎng)頁的請求響應,分析網(wǎng)頁布局后對關鍵信息進行循環(huán)抓取,并利用正則表達式將抓取的信息提取為格式化數(shù)據(jù),然后將數(shù)據(jù)本地化存儲為Microsoft Excel表格或存儲至數(shù)據(jù)庫中,最后利用Echarts將數(shù)據(jù)以可視化的方式在Web端展示,從而實現(xiàn)對農(nóng)業(yè)網(wǎng)絡數(shù)據(jù)的挖掘和利用。
關鍵詞:Scrapy;爬蟲;網(wǎng)絡數(shù)據(jù);數(shù)據(jù)挖掘;玉米價格
中圖分類號: S126 文獻標識號:A文章編號:1001-4942(2018)01-0142-06
Abstract Accurate, timely and efficient access to agricultural data is the prerequisite and basis for analysis and early warning of agricultural informations in the whole industry chain. It is the key to enhancing the professionalization and standardization of agricultural information analysis and early warning. With the maize price as an example, the research focused on large amounts of agricultural informations on the Internet and developed data crawling and normalized storage strategies. Firstly, we created request & response to the web pages based on Scrapy framework, analyzed the web page layout and then crawled the key informations cyclically;the data were extracted into formatted data using regular expressions, and then were stored as the localized data in a Microsoft Excel spreadsheet or in a database. Finally, Echarts was used to visualize the data on the Web, and thus the mining and utilization of agricultural network data were realized.
Keywords Scrapy; Crawler; Network data; Data mining; Maize price
隨著大數(shù)據(jù)技術的發(fā)展,農(nóng)業(yè)大數(shù)據(jù)的開發(fā)和利用逐漸成為當前研究的熱點。農(nóng)業(yè)大數(shù)據(jù)來源于農(nóng)業(yè)生產(chǎn)、農(nóng)業(yè)經(jīng)濟、農(nóng)業(yè)流通、農(nóng)業(yè)科技等各個方面,來源廣,類型多,結構復雜,具有潛在應用價值。數(shù)據(jù)來源不同,其獲取技術不同,目前農(nóng)業(yè)大數(shù)據(jù)獲取主要包括:農(nóng)業(yè)生產(chǎn)環(huán)境數(shù)據(jù)采集、生命信息智能感知、農(nóng)田變量信息快速采集、農(nóng)業(yè)遙感數(shù)據(jù)獲取、農(nóng)產(chǎn)品市場經(jīng)濟數(shù)據(jù)采集、農(nóng)業(yè)網(wǎng)絡數(shù)據(jù)抓取等[1]。在“互聯(lián)網(wǎng)+農(nóng)業(yè)”的發(fā)展形勢下,農(nóng)業(yè)網(wǎng)絡數(shù)據(jù)已成為農(nóng)業(yè)大數(shù)據(jù)的重要組成部分,但由于其數(shù)據(jù)格式復雜多樣,不利于快速統(tǒng)計分析,多僅是對數(shù)據(jù)的粗略展示,因此,如何有效統(tǒng)一農(nóng)業(yè)網(wǎng)絡數(shù)據(jù)格式,進一步挖掘數(shù)據(jù)的深層價值,成為當前大數(shù)據(jù)技術研究的重點。
農(nóng)產(chǎn)品市場價格信息對于分析農(nóng)產(chǎn)品市場行情變化,預測其價格走勢,降低交易風險,增加收益,具有重要意義。目前,網(wǎng)絡上的農(nóng)產(chǎn)品價格數(shù)據(jù),一般是由特定工作人員采集市場價格信息后通過移動終端上報各農(nóng)業(yè)服務機構,再由農(nóng)業(yè)服務機構發(fā)布到網(wǎng)上[2,3],對農(nóng)產(chǎn)品交易具有一定的指導意義。但由于各服務機構發(fā)布的數(shù)據(jù)格式不統(tǒng)一,不利于對相關數(shù)據(jù)的進一步挖掘分析,限制了其利用價值。利用爬蟲技術從網(wǎng)絡中以一定的規(guī)則采集數(shù)據(jù),并統(tǒng)一格式存儲,為進一步挖掘網(wǎng)絡數(shù)據(jù)應用價值奠定了基礎[4-7]。
網(wǎng)絡爬蟲(web crawler)也叫網(wǎng)絡蜘蛛(web spider),是實現(xiàn)自動瀏覽網(wǎng)頁和網(wǎng)頁數(shù)據(jù)抓取的計算機應用程序。Scrapy是使用Python編寫的爬蟲應用框架程序,具有結構簡單、使用方便的特點,用戶借助Scrapy可以快速瀏覽下載網(wǎng)頁信息,并根據(jù)需要保存關鍵數(shù)據(jù)為需要的數(shù)據(jù)格式。目前,Scrapy被廣泛應用于數(shù)據(jù)挖掘領域,已經(jīng)發(fā)展成為數(shù)據(jù)挖掘研究領域重要的應用工具[8]。
玉米是我國重要的糧食作物,玉米價格是市場發(fā)展和供給平衡狀態(tài)的直接反映,通過提取其市場價格信息,不僅能夠直觀展示玉米交易市場的發(fā)展態(tài)勢,同時有利于為供給側結構性改革提供數(shù)據(jù)支撐,為相關部門制定生產(chǎn)發(fā)展決策提供理論依據(jù)。本研究以網(wǎng)絡上發(fā)布的玉米市場價格為例,基于Scrapy設計爬蟲,從中國飼料行業(yè)信息網(wǎng)爬取玉米價格信息數(shù)據(jù),并以Microsoft Excel 表格的形式存儲或存為數(shù)據(jù)庫,以期為農(nóng)業(yè)網(wǎng)絡數(shù)據(jù)的進一步挖掘利用提供一種有效的數(shù)據(jù)提取方法。
1 基于Scrapy的爬蟲設計
1.1 Scrapy框架
網(wǎng)絡爬蟲是以一定的規(guī)則自動抓取互聯(lián)網(wǎng)信息的程序或者腳本,需要面向不同的應用場合解決網(wǎng)絡連接、爬取策略等問題[9-12]。Scrapy爬蟲框架可以幫助開發(fā)者快速開發(fā)爬蟲,其基于Twisted異步網(wǎng)絡庫來處理網(wǎng)絡通訊,能夠實現(xiàn)并行、分布式爬取,提高了爬取效率。endprint
Scrapy爬蟲框架的結構如圖1所示,包括以下5個主要模塊:
①Scrapy Engine:引擎,負責Spiders(爬蟲)、Item Pipeline(隊列)、Downloader(下載器)、Scheduler(調(diào)度器)之間的信息通訊和數(shù)據(jù)傳遞;
②Scheduler:調(diào)度器,負責接受引擎發(fā)送過來的Requests(請求),并按照一定的規(guī)則放入隊列中;
③Downloader:下載器,負責下載Scrapy Engine發(fā)送的所有Requests,并將其獲取到的Responses(響應)交還給Scrapy Engine,由引擎交給Spiders來處理;
④Spiders:負責處理所有Responses,從中提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進的URL提交給引擎,再次進入Scheduler;
⑤Item Pipeline:負責處理Spiders中獲取到的Item,并進行處理,如去重、持久化存儲等。
Scrapy的工作流程是:Scrapy Engine啟動并控制爬蟲運行,首先由Spider根據(jù)編寫的爬蟲策略控制Scrapy Engine向Scheduler發(fā)送請求(Requests),Scheduler將請求加入隊列,依次向Downloader發(fā)送,Downloader接收請求后將互聯(lián)網(wǎng)信息下載到本地成為響應(Response),傳遞給Spiders處理后形成Items,由Pipeline保存或輸出。
1.2 玉米價格爬蟲設計
1.2.1 玉米價格爬蟲特點 網(wǎng)絡爬蟲分為全網(wǎng)爬蟲和聚焦爬蟲。全網(wǎng)爬蟲面向整個互聯(lián)網(wǎng),目的是盡可能多地索引互聯(lián)網(wǎng)資源[13],是實現(xiàn)搜索引擎的主要工具;聚焦爬蟲面向特定目標,目的是獲取信息和數(shù)據(jù),是信息挖掘的主要工具。玉米價格爬蟲為聚焦爬蟲,目標不是從網(wǎng)絡資源中抓取特定網(wǎng)頁,而是從特定網(wǎng)站分類和檢索有價值的信息。因此,玉米價格爬蟲不需要檢索全網(wǎng)資源,負載小,設計重點是對價格數(shù)據(jù)的提取。
1.2.2 爬取策略設計 以中國飼料行業(yè)信息網(wǎng)的玉米頁面(http://www.feedtrade.com.cn/yumi/yumi_daily/)為例,見圖2。矩形框①標注的區(qū)域為玉米價格的文章列表;橢圓框②標注的區(qū)域為待爬取的文章標題。玉米價格爬蟲的目標,是在網(wǎng)頁中定位文章列表區(qū)域,獲取文章列表,從中篩選出希望爬取的文章標題,根據(jù)標題指向的鏈接進入文章內(nèi)容頁,從內(nèi)容頁中下載需要的信息到本地,不斷循環(huán)直至獲取所有需要的信息。
爬蟲工作流程如圖3,把入口點鏈接(http://www.feedtrade.com.cn/yumi/yumi_daily/)加入調(diào)度器(任務隊列)中,調(diào)度器將任務分配給下載器,下載器將鏈接指向的頁面下載到本地,根據(jù)解析規(guī)則判斷該頁面為文章列表頁,從該頁面獲取文章列表,根據(jù)列表中的標題是否包含“山東”、“玉米”字段選擇待爬取的文章標題,取出標題指向的內(nèi)容鏈接放入調(diào)度器中,之后判斷文章列表頁是否有下一頁,如果有就將下一頁指向的鏈接放入調(diào)度器,依此循環(huán),直至不存在下一頁。這樣就將所有的文章內(nèi)容頁鏈接放入到了調(diào)度器,當下載器下載到文章內(nèi)容頁,就會下載玉米價格文章,交由Pipeline做分析處理,提取玉米價格信息。當調(diào)度器中所有的鏈接都被下載,玉米價格信息爬取完成。
2 爬蟲實現(xiàn)
2.1 定義爬取對象
網(wǎng)頁中包含許多內(nèi)容,爬蟲只抓取需要的內(nèi)容。爬蟲的Item定義了爬取的對象,在玉米價格爬蟲中,用MaizeItem定義爬取對象,包括:文章標題、文章日期、文章鏈接、文章內(nèi)容。
2.2 網(wǎng)頁爬取
Web網(wǎng)頁是結構化的,網(wǎng)頁中的任何內(nèi)容都處于結構體中,因此可以在結構體的路徑中查詢到。如圖4所示,在Chrome瀏覽器中右鍵選擇“檢查”,可以看到網(wǎng)頁的結構體,框①顯示網(wǎng)頁中展示的玉米價格條目,框②為該條目在結構體中內(nèi)容,其中包括文字信息和指向鏈接,框③為該條目在結構體中的路徑。使用xpath()可以根據(jù)結構體的路徑定位到玉米價格條目。在玉米價格爬蟲中,程序寫為:1. content=response.xpath(‘//ul/li/a[contains(@title,"山東玉米")])
該段代碼表示查找所有處于“ul/li/a”路徑下,題名包含“山東玉米”的條目,從中提取文章標題、文章日期和文章鏈接放入MaizeItem中。文章鏈接存為contentUrl,放入調(diào)度器中。對文章內(nèi)容頁的解析與文章列表頁不同,使用scrapy.Request(contentUrl, callback=self.parseMaizePrice)指定解析規(guī)則是parseMaizePrice()。在parseMaizePrice中編寫解析規(guī)則,同樣使用xpath抓取文章內(nèi)容,存入MaizeItem中,這樣形成了一條包括文章標題、日期、鏈接、內(nèi)容的完整Item條目,交給Pipeline處理。此外,在文章列表頁和文章內(nèi)容頁使用xpath()定位“下一頁”的鏈接,如果存在,則放入調(diào)度器中,繼續(xù)循環(huán)。
2.3 數(shù)據(jù)提取
在Pipeline中對爬取的MaizeItem對象進行處理,形成按日期索引的玉米價格數(shù)據(jù)。其中,MaizeItem中的文章內(nèi)容是文字格式,形式如“……山東濰坊市壽光金玉米淀粉,價格統(tǒng)一調(diào)整為1.6元/千克。濰坊壽光新豐淀粉,水分30以內(nèi)價格執(zhí)行1.61元/千克,落0.01元……”,該內(nèi)容信息分散,難以利用,需要對其進行進一步提取,以形成方便利用的價格數(shù)據(jù)。經(jīng)分析,MaizeItem數(shù)據(jù)中包含的多個公司的玉米價格信息,只有部分文字內(nèi)容和價格數(shù)據(jù)是每日變動的,而公司名是每日重復的。因此,數(shù)據(jù)提取的任務是:忽略文字內(nèi)容,提取出公司名稱和價格數(shù)據(jù),并建立二者的關聯(lián)關系。endprint
首先整理出公司名稱列表,根據(jù)該列表,使用正則表達式查找并提取該公司的玉米價格。正則表達式以“\d”表示數(shù)字,使用匹配規(guī)則“公司名稱+‘.*?(\d+.\d*)元/千克”可以查找到公司名稱下以“元/千克”為單位的價格數(shù)字。但價格數(shù)據(jù)的類型并不完全相同,有的是“X.X元/千克”的形式,還有的是“XX元/噸”或者“XX-XX元/噸”的形式,所以需要對公司列表根據(jù)價格數(shù)據(jù)的類型進行分類,然后用不同的正則表達式提取價格數(shù)據(jù)。數(shù)據(jù)提取的結果是公司列表中公司每日的玉米價格數(shù)據(jù)。
2.4 數(shù)據(jù)存儲
對于爬取得到的數(shù)據(jù)可以本地化存儲,也可以存入數(shù)據(jù)庫中。
2.4.1 本地化存儲 雖然Pipeline中可以直接建立json文件將數(shù)據(jù)寫入,但json文件可讀性比較差,因此,本研究嘗試將json文件進一步處理后保存為可讀性強的excel文件。提取到的公司每日玉米價格數(shù)據(jù)表是一個二維表結構,Pandas庫是python中處理數(shù)據(jù)的主要工具,借助其中的DataFrame可以存儲二維表結構。首先建立“{公司名:玉米價格}”的字典priceDict,再建立“{日期:priceDict}”的二維字典priceAll,將其保存為DataFrame,然后以公司列表建立DataFrame的索引,最終使用DataFrame的to_excel()方法保存為Excel文件(圖5)。
2.4.2 數(shù)據(jù)庫存儲 按照Scrapy中定義的數(shù)據(jù)模型在數(shù)據(jù)庫中建立表,使用python的第三方模塊pymysql登錄數(shù)據(jù)庫,執(zhí)行sql語句向數(shù)據(jù)庫中插入數(shù)據(jù)。為實現(xiàn)增量爬取,需要在數(shù)據(jù)表中建立校驗字段,以內(nèi)容鏈接的MD5加密信息作為校驗信息存儲,在插入數(shù)據(jù)前,先查詢數(shù)據(jù)的校驗信息是否已經(jīng)在數(shù)據(jù)庫中存在,防止插入重復的數(shù)據(jù)。
2.5 數(shù)據(jù)爬取結果展示
將爬取的玉米價格數(shù)據(jù)利用Echarts控件在Web中展示(如圖5)。項目共享在Github上:https://github.com/joray86/maizeSpider。
3 結語
本研究實現(xiàn)了基于Scrapy的農(nóng)業(yè)網(wǎng)絡數(shù)據(jù)爬取,爬蟲運行環(huán)境為CPU i5-4210U、4GB內(nèi)存、Windows 7 64位操作系統(tǒng),爬取中國飼料行業(yè)信息網(wǎng)(http://www.feedtrade.com.cn/yumi/yumi_daily/)的山東玉米價格信息,共訪問頁面228個,耗時6 383 ms,提取到山東省的玉米市場流通價格數(shù)據(jù),可在Web中進行可視化展示,也可持久化存儲到數(shù)據(jù)庫中或者存為Excel文件,這為用大數(shù)據(jù)方法進一步挖掘有價值的信息、市場信息監(jiān)測和預警分析,以及政府決策和供需結構調(diào)整等提供了有力、可靠的數(shù)據(jù)支撐。
利用爬取的山東省玉米市場價格數(shù)據(jù),可實現(xiàn)玉米市場價格的年度間同比和月、日數(shù)據(jù)環(huán)比分析,獲得玉米市場價格的變化趨勢,可為玉米產(chǎn)業(yè)的生產(chǎn)、流通、加工各環(huán)節(jié)起到一定的引領和指導作用。
參 考 文 獻:
[1] 王文生, 郭雷風.農(nóng)業(yè)大數(shù)據(jù)及其應用展望[J].江蘇農(nóng)業(yè)科學, 2015, 43(9):43-46.
[2] 張石銳, 鄭文剛, 申長軍, 等.嵌入式手持無線農(nóng)產(chǎn)品價格信息采集終端[J].計算機工程與設計, 2012, 33(2):514-518.
[3] 尚明華, 秦磊磊, 王風云, 等.基于智能手機的小麥生產(chǎn)風險信息采集系統(tǒng)[J].農(nóng)業(yè)工程學報, 2011, 27(5):178-182.
[4] 段青玲, 魏芳芳, 張磊, 等.基于數(shù)據(jù)的農(nóng)業(yè)網(wǎng)絡信息自動采集與分類系統(tǒng)[J].農(nóng)業(yè)工程學報, 2016, 32(12):172-178.
[5] 孟繁疆, 姬祥, 袁琦, 等.農(nóng)產(chǎn)品價格主題搜索引擎的研究與實現(xiàn)[J].東北農(nóng)業(yè)大學學報, 2016, 47(9):64-71.
[6] 郭雷風.面向農(nóng)業(yè)領域的大數(shù)據(jù)關鍵技術研究[D].北京:中國農(nóng)業(yè)科學院, 2016.
[7] 李慧, 何永賢, 葉云.基于聚焦爬蟲的農(nóng)業(yè)信息服務平臺設計與實現(xiàn)[J].天津農(nóng)業(yè)科學, 2016, 10(10):60-63.
[8] 馬聯(lián)帥. 基于Scrapy的分布式網(wǎng)絡新聞抓取系統(tǒng)設計與實現(xiàn)[D].西安:西安電子科技大學,2015.
[9] 時永坤.基于Web Driver的定向網(wǎng)絡爬蟲設計與實現(xiàn)[J].軟件, 2016, 37(9):94-97.
[10]杜彬.基于Selenium的定向網(wǎng)絡爬蟲設計與實現(xiàn)[J].金融科技時代, 2016, 7(7):35-39.
[11]趙本本, 殷旭東, 王偉.基于Scrapy的GitHub數(shù)據(jù)爬蟲[J].電子技術與軟件工程, 2016, 6(6):199-202.
[12]夏火松, 李保國.基于Python的動態(tài)網(wǎng)頁評價爬蟲算法[J].軟件工程, 2016, 19(2):43-46.
[13]Castillo C. Effective web crawling[J]. ACM SIGIR Forum,2005, 39(1):55-56.endprint