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