[摘要]互聯(lián)網(wǎng)上有著十分豐富的農(nóng)產(chǎn)品信息,用Python編寫網(wǎng)絡(luò)爬蟲進(jìn)行網(wǎng)上農(nóng)產(chǎn)品的數(shù)據(jù)抓取,抓取的數(shù)據(jù)存儲(chǔ)進(jìn)文件或者數(shù)據(jù)庫中,利用Python的第三方庫進(jìn)行數(shù)據(jù)處理和分析,最后再用Matlabplot庫輸出可視化圖表,給出分析結(jié)論。這是一種簡(jiǎn)單易行、代價(jià)低廉的大數(shù)據(jù)實(shí)現(xiàn)方法,該方法在中國廣大的農(nóng)村具有普遍實(shí)現(xiàn)的意義。
[關(guān)鍵詞]大數(shù)據(jù);爬蟲;Python;處理分析
[中圖分類號(hào)]TP311[文獻(xiàn)標(biāo)識(shí)碼] A
1? ? 概述
大數(shù)據(jù)技術(shù)飛速發(fā)展,各行各業(yè)都努力引入這些先進(jìn)技術(shù),從互聯(lián)網(wǎng)上獲取大數(shù)據(jù),進(jìn)行處理和分析,利用分析結(jié)果提高生產(chǎn)力或者輔助決策等。因?yàn)橹袊鴱V大的農(nóng)村交通不便、信息閉塞、設(shè)備落后,也沒有充分的技術(shù)支持和人才儲(chǔ)備,所以雖然在互聯(lián)網(wǎng)上有著豐富的農(nóng)產(chǎn)品信息資源,但要成為有用的數(shù)據(jù),卻面臨著數(shù)據(jù)抓取和處理分析的難題。本文介紹一種設(shè)備要求低且容易實(shí)現(xiàn)的方法,即利用Python語言構(gòu)建網(wǎng)絡(luò)爬蟲從互聯(lián)網(wǎng)上獲取數(shù)據(jù)并處理分析,非常適合廣大農(nóng)村的農(nóng)產(chǎn)品大數(shù)據(jù)獲取和處理分析。
2? ? 利用Python網(wǎng)絡(luò)爬蟲抓取互聯(lián)網(wǎng)上的農(nóng)產(chǎn)品數(shù)據(jù)
2.1? ? Python爬蟲及其基礎(chǔ)庫
網(wǎng)絡(luò)爬蟲是按照一定的規(guī)則自動(dòng)劉曉剛:農(nóng)產(chǎn)品大數(shù)據(jù)的抓取和分析方法探索抓取萬維網(wǎng)信息的程序或者腳本。這個(gè)程序可以用多種語言編寫,用Python編寫更是簡(jiǎn)單快捷且功能強(qiáng)大。用戶獲取網(wǎng)絡(luò)數(shù)據(jù)的方式一般是瀏覽器提交請(qǐng)求,從服務(wù)器下載網(wǎng)頁代碼,解析成頁面;同理,爬蟲的基本流程是模擬瀏覽器發(fā)送請(qǐng)求去獲取網(wǎng)頁代碼,然后解析并提取有用的數(shù)據(jù),存放于數(shù)據(jù)庫或文件中。具體過程是爬蟲使用http庫向目標(biāo)站點(diǎn)發(fā)起請(qǐng)求,即發(fā)送一個(gè)Request,Request包含請(qǐng)求頭、請(qǐng)求體等。如果服務(wù)器能正常響應(yīng),則會(huì)得到一個(gè)回應(yīng)Response,Response包含html、json、圖片、視頻等。Python程序接著解析html數(shù)據(jù),利用正則表達(dá)式、第三方解析庫如Beautifulsoup,Lxml,解析json數(shù)據(jù)、二進(jìn)制數(shù)據(jù)等,以文本或二進(jìn)制格式寫入到文件(如CSV、Excel),或者保存數(shù)據(jù)到數(shù)據(jù)庫(如MySQL、Mongdb、Redis)中。
為了防止被服務(wù)器當(dāng)作非法用戶主機(jī)拒絕訪問,爬蟲程序都會(huì)加上請(qǐng)求頭。請(qǐng)求頭中包含User-Agent和Cookies、Referrer等信息。User-Agent是一個(gè)特殊字符串,使得服務(wù)器能夠識(shí)別客戶使用的瀏覽器及版本等參數(shù),Cookie用來保存訪客以前的登錄信息,Referrer說明訪問源從哪里來,一些大型網(wǎng)站會(huì)通過Referrer 做防盜鏈策略。
爬蟲程序通過各種庫來實(shí)現(xiàn)很多功能。其中最基礎(chǔ)的庫有三個(gè),其一是Requests庫,它的作用是請(qǐng)求網(wǎng)站獲取網(wǎng)頁數(shù)據(jù)。其二是BeautifulSoup庫,它把Requests庫請(qǐng)求到的網(wǎng)頁解析為容易識(shí)別的Soup文檔,以便過濾和提取數(shù)據(jù)。其三是Lxml庫,它的主要功能也是解析網(wǎng)頁源代碼,但使用C語言編寫,速度比BeautifulSoup庫更快。
爬蟲程序用BeatifulSoup庫的Lxml解析器來解析指定的html文檔,結(jié)果存放到變量中。然后通過Beautifulsoup之標(biāo)簽選擇器功能,用select()方法傳入字符串參數(shù),就能返回需要的選擇結(jié)果。如選擇所有title標(biāo)簽的代碼就是兩句,第一句是soup = BeautifulSoup(html,lxml);第二句是soup.select(“title”),選擇的結(jié)果以列表形式返回;同理,選擇所有p標(biāo)簽中的第三個(gè)標(biāo)簽的代碼是:soup.select(“p:nth-of-type(3)”) ;這種網(wǎng)頁解析方式簡(jiǎn)單方便,容易理解。
2.2? ? 利用爬蟲抓取互聯(lián)網(wǎng)農(nóng)產(chǎn)品信息
獲取互聯(lián)網(wǎng)上的農(nóng)產(chǎn)品數(shù)據(jù),建議分三步進(jìn)行。第一步用Chrome瀏覽器打開一個(gè)銷售農(nóng)產(chǎn)品的網(wǎng)頁,在一個(gè)售價(jià)上右擊鼠標(biāo)選擇“檢查”,從而獲取到元素定位;在自動(dòng)跳出的右邊的檢查區(qū)上選擇這個(gè)售價(jià),右擊鼠標(biāo)選擇“copy”下的“copy selector”,獲得選擇器代碼,即售價(jià)元素定位字符串“#page_list > ul > li:nth-child(1) > div.result_btm> span.result_price > i”。第二步,從Chrome中提取User-Agent。在Chrome菜單的開發(fā)者工具中選中Network選項(xiàng)中指定的網(wǎng)站名,在其中的Headers選項(xiàng)卡下面的Request Header中復(fù)制User-Agent。第三步,在Python的IDE(如Spyder或PyCharm)中新建Python文件,加入U(xiǎn)ser-Agent,編寫其它代碼并運(yùn)行,運(yùn)行結(jié)果輸出一個(gè)農(nóng)產(chǎn)品價(jià)格。如果需要獲取這個(gè)頁面上所有的農(nóng)產(chǎn)品價(jià)格,只需簡(jiǎn)單地改寫代碼利用循環(huán)輸出即可,將selector改為“#page_list > ul > li > div.result_btm > span.result_price > i”,即將“l(fā)i”后面的限定符去掉,表示要抓取所有的“l(fā)i”,從而獲取所有“l(fā)i”中的農(nóng)產(chǎn)品價(jià)格。
2.3? ? 利用爬蟲抓取多個(gè)農(nóng)產(chǎn)品的信息
利用爬蟲抓取農(nóng)產(chǎn)品中包括價(jià)格在內(nèi)的多個(gè)信息,必須定義多頁面爬蟲。首先是手動(dòng)翻頁并觀察各網(wǎng)頁的URL構(gòu)成特點(diǎn),構(gòu)造出所有頁面的URL存入列表中。次之要根據(jù)URL列表依次循環(huán)取出具體的URL,根據(jù)上面的抓取單個(gè)信息爬蟲的原理定義爬蟲,并添加其它信息的選擇器,增加語句用這些選擇器來抓取多個(gè)數(shù)據(jù),并循環(huán)存儲(chǔ)抓取的數(shù)據(jù)。
訪問多個(gè)出售農(nóng)產(chǎn)品的頁面,再到每個(gè)頁面中尋找農(nóng)產(chǎn)品信息抓取信息數(shù)據(jù)時(shí),可能需要跨越多級(jí)頁面,可以用多級(jí)循環(huán),定義多個(gè)方法完成。為了防止頻繁訪問同一個(gè)網(wǎng)站帶來的限制,建議爬蟲運(yùn)行一段時(shí)間休息幾秒,用time庫的sleep方法實(shí)現(xiàn)。
3? ? 利用Python對(duì)抓取的數(shù)據(jù)進(jìn)行分析
從網(wǎng)頁抓到數(shù)據(jù)后并不能直接使用,必須經(jīng)過數(shù)據(jù)處理,去除重復(fù)值、空值等,保留有用的信息,才能進(jìn)行分析。Python可以做多種的數(shù)據(jù)處理,如數(shù)據(jù)清洗,處理缺失數(shù)據(jù)以及清除無意義的信息,用drop_duplicates方法處理去掉重復(fù)值,也可以用dropna方法刪除數(shù)據(jù)為空所對(duì)應(yīng)的行,還可以用fillna方法用其他數(shù)值替代NaN空值。用slice方法可以進(jìn)行字段抽取,抽出某列上指定位置的數(shù)據(jù)做成新的列;還可以進(jìn)行隨機(jī)抽樣、排名索引、數(shù)據(jù)合并、數(shù)據(jù)計(jì)算、數(shù)據(jù)分組、日期處理、數(shù)據(jù)分析、分組分析、分布分析、交叉分析、結(jié)構(gòu)分析、相關(guān)分析等高級(jí)分析功能,這些功能僅需幾行代碼即可實(shí)現(xiàn)。
4? ? 利用Python對(duì)農(nóng)產(chǎn)品數(shù)據(jù)進(jìn)行可視化分析
處理分析的結(jié)果最后需要制作成效果明顯的可視化圖形。雖然Excel也有這方面的功能,而且操作簡(jiǎn)單,提供的圖形樣式也滿足大部分需要。但是Excel的性能處理不了大數(shù)據(jù),其它的大數(shù)據(jù)工具要么操作復(fù)雜要么設(shè)備要求高端,而使用Python的第三方庫如Matplotlib或Seaborn就能輕易地完成這個(gè)工作。
從Matplotlib庫中中導(dǎo)入pyplot繪圖模塊,簡(jiǎn)稱為plt。pyplot模塊是Matplotlib最核心的模塊,幾乎所有樣式的2D圖形都是通過該模塊繪制出來的。plt.plot是pyplot模塊下面的直線繪制方法,用它可以快速地畫出需要的折線,用plt.show方法可以將圖形顯示出來。同理用matplotlib.pyplot.bar方法可以方便地實(shí)現(xiàn)柱形圖,僅把plt.plot方法改成plt.bar即可;用matplotlib.pyplot.pie方法可以畫出常用的餅狀圖等等……只需要幾行簡(jiǎn)單的代碼和基本的編程知識(shí),就可以得到需要的各種樣式的分析圖表。
[參考文獻(xiàn)]
[1] 姜杉彪,黃凱林,盧昱江,等.基于Python的專業(yè)網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)[J]. 企業(yè)科技與發(fā)展,2016(08):17-19.
[2] 謝克武.大數(shù)據(jù)環(huán)境下基于python的網(wǎng)絡(luò)爬蟲技術(shù)[J].電子制作,2017(09):44-45.
[3] 姚建盛,李淑梅. Python在科學(xué)計(jì)算中的應(yīng)用[J].數(shù)字技術(shù)與應(yīng)用,2016(11):76.