沈 漪, 華敏敏
(無錫科技職業(yè)學(xué)院, 江蘇 無錫 214028)
互聯(lián)網(wǎng)包含了最有用的數(shù)據(jù)集,并且大部分?jǐn)?shù)據(jù)可以免費公開訪問。它們被嵌入在網(wǎng)站的結(jié)構(gòu)和樣式當(dāng)中,可以通過網(wǎng)絡(luò)爬蟲技術(shù)來獲取。
本文基于項目中獲取福彩獎池數(shù)據(jù)的需求,對福彩網(wǎng)站進(jìn)行爬取,獲取最新的獎池數(shù)據(jù)。
從明確爬取需求到數(shù)據(jù)爬取成功,一般包含以下步驟:
1.明確要爬取的網(wǎng)站和數(shù)據(jù)。
2.下載網(wǎng)頁,如需抓取的數(shù)據(jù)不在其中,即需抓取的數(shù)據(jù)在動態(tài)網(wǎng)頁中,執(zhí)行3,否則執(zhí)行4。
3.分析網(wǎng)頁結(jié)構(gòu),根據(jù)不同的動態(tài)技術(shù)使用合適的方法獲取相關(guān)動態(tài)網(wǎng)頁內(nèi)容。
4.選擇合適的方法抓取數(shù)據(jù)。
5.改進(jìn)優(yōu)化,提高爬蟲效率。
Python語言是進(jìn)行爬蟲實現(xiàn)的最佳語言,本文選擇Anaconda開發(fā)環(huán)境中的jupyter notebook進(jìn)行Python開發(fā)調(diào)試與分析,Python版本選用Python3.6。
首先,能抓到獎池數(shù)據(jù)的網(wǎng)站比較多,本文選擇中國福利彩票發(fā)行管理中心官方網(wǎng)站http://www.cwl.gov.cn/kjxx/ssq/kjgg/進(jìn)行爬取。
要想爬取網(wǎng)頁,我們首先將其下載下來。我們選擇最基礎(chǔ)的方式使用Python的urllib模塊進(jìn)行下載,代碼如下:
代碼中對于訪問網(wǎng)站時出現(xiàn)5XX的錯誤(一般是服務(wù)器出現(xiàn)問題),會遞歸調(diào)用函數(shù)進(jìn)行重試下載,參數(shù)num_retries用于設(shè)定重試下載的次數(shù),其默認(rèn)值為兩次,增強了代碼的健壯性。由于urllib.request.urlopen(url).read()返回的是字節(jié)型的數(shù)據(jù),用decode('utf-8')轉(zhuǎn)化成相應(yīng)字符數(shù)據(jù)。
網(wǎng)頁下載下來以后,發(fā)現(xiàn)獎池數(shù)據(jù)并不在其中,利用瀏覽器的F12網(wǎng)頁分析工具對網(wǎng)頁進(jìn)行分析,在Network模塊XHR選項中發(fā)現(xiàn)動態(tài)行為,分析代碼找到相應(yīng)動態(tài)訪問的網(wǎng)址,并獲取到相關(guān)訪問屬性,按照這些訪問屬性對動態(tài)訪問的網(wǎng)址進(jìn)行下載。代碼如下:
其中,http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=30為網(wǎng)頁動態(tài)訪問獲取彩票中獎信息的網(wǎng)址,該網(wǎng)址不能直接訪問,要設(shè)置相關(guān)訪問屬性,包括User-agent、Cookie等。
下載下來發(fā)現(xiàn),返回的是Json格式的數(shù)據(jù),獎池數(shù)據(jù)就包含在其中。然后,進(jìn)行數(shù)據(jù)抓取,由于要抓取的數(shù)據(jù)量較小,而且在下載下來的Json格式數(shù)據(jù)中特征明顯,我們直接使用正則表達(dá)式實現(xiàn)。代碼如下:
代碼返回的就是我們需要的最新獎池數(shù)據(jù)。經(jīng)過多天多次測試,均能得到最新獎池數(shù)據(jù)。由于本項目需求中爬取的數(shù)據(jù)量較小,因而無需改進(jìn)代碼,效率已經(jīng)可以達(dá)到項目要求。
本文從需求開始完整呈現(xiàn)了用Python進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)爬取的全過程,由于場景特殊,選擇的方法較為簡單,考慮的因素也較少。遇到網(wǎng)頁數(shù)據(jù)量大,爬取的數(shù)據(jù)較復(fù)雜的情況,要考慮的因素會復(fù)雜許多,比如下載緩存、并發(fā)下載等等。在數(shù)據(jù)抓取時,除了正則表達(dá)式,還可以選擇Beautiful Soup、lxml等方式。要在不同的場景下做出適當(dāng)?shù)牟呗赃x擇,也是爬蟲實現(xiàn)的一大挑戰(zhàn)。