王 康 史雅婷 梁洪炎 吉卓嘎 強(qiáng)巴卓瑪
西藏民族大學(xué)信息工程學(xué)院
在大數(shù)據(jù)時(shí)代,誰(shuí)擁有了數(shù)據(jù),誰(shuí)就有更多的籌碼。氣象服務(wù)是這個(gè)時(shí)代必不可少的部分,人們每天的出行計(jì)劃需要依靠今天的天氣狀況來(lái)定。氣象部門(mén)每天通過(guò)手機(jī)、電視、報(bào)紙、廣播、短信來(lái)告知人們今天的天氣狀況,以防范自然災(zāi)害等突發(fā)狀況。截至2018年,全國(guó)共有661個(gè)市,每小時(shí)統(tǒng)計(jì)一次,在一天內(nèi)就收集到了661×24=15 864條數(shù)據(jù)。
網(wǎng)絡(luò)爬蟲(chóng)本質(zhì)上是利用程序在網(wǎng)上搜集有用的數(shù)據(jù),是一種按照一定的規(guī)則,自動(dòng)抓取互聯(lián)網(wǎng)信息的腳本。開(kāi)發(fā)者可以隨意地?cái)U(kuò)展各個(gè)組件,來(lái)實(shí)現(xiàn)抓取邏輯。網(wǎng)絡(luò)爬蟲(chóng)能幫助人們快捷、方便地獲取天氣網(wǎng)特定城市近7天內(nèi)的天氣預(yù)報(bào)數(shù)據(jù)。
網(wǎng)絡(luò)爬蟲(chóng)有很多類(lèi)型,不同類(lèi)型的爬蟲(chóng)適用于不同的場(chǎng)景,本文提到的爬蟲(chóng)為批量性爬蟲(chóng),這種爬蟲(chóng)一般適用于用戶(hù)明確自己想要的信息或者知道所需信息的網(wǎng)絡(luò)結(jié)構(gòu)位置。但在一些大數(shù)據(jù)或者超大數(shù)據(jù)的分析與處理中,一般要用增量型爬蟲(chóng),其是一種沒(méi)有明確限制的爬蟲(chóng),信息量大且比較雜亂,需要用機(jī)器學(xué)習(xí)和深度學(xué)習(xí)對(duì)爬去的信息進(jìn)行分析和處理,而且增量型爬蟲(chóng)容易被網(wǎng)站反爬蟲(chóng)程序檢測(cè)。除此之外,還有深度網(wǎng)絡(luò)爬蟲(chóng)等。
XPath是在XML文檔中查找信息的一種語(yǔ)言,用于在XML文檔中通過(guò)元素和屬性進(jìn)行導(dǎo)航。XPath使用路徑表達(dá)式來(lái)選取XML文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。XPath依賴(lài)于Python中的lxml第三方類(lèi)包。XPath使用路徑表達(dá)式選取XML文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。正則表達(dá)式是一個(gè)特殊的字符序列,用來(lái)檢查一個(gè)字符串是否與某種模式匹配,通過(guò)特殊的語(yǔ)法來(lái)表示。正則表達(dá)式依賴(lài)于Python中的re模塊。部分正則表達(dá)式常用符號(hào)如表1所示,正則表達(dá)式的書(shū)寫(xiě)規(guī)則較多,這里不再一一贅述。XPath解析的原理如圖1所示。
表1 具體正則表達(dá)式常見(jiàn)符號(hào)(部分)
圖1 XPath解析的原理
lxml用于解析XML和HTML文件??梢钥焖俣ㄎ?,搜索、獲取特定內(nèi)容。其支持XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且實(shí)現(xiàn)了常見(jiàn)的ElementTree API。lxml模塊中常用的有l(wèi)xml.html,lxml.etree,lxml.cssselect,lxml.BeautifulSoup。在天氣數(shù)據(jù)爬取中,本設(shè)計(jì)主要用到的是lxml.etree模塊。Xwlt是Python用來(lái)在Excel寫(xiě)入數(shù)據(jù)和格式化數(shù)據(jù)的工具包,是用來(lái)生成兼容Excel997/2000/XP/2003,OpenOffice.org CalcGnumeric的表格庫(kù)。本文利用 xlwt模塊將爬取的天氣數(shù)據(jù)寫(xiě)入Excel文件。Matplotlib是Python中類(lèi)似MATLAB的繪圖工具,文章引入Matplotlib模塊將爬取的天氣數(shù)據(jù)以圖片形式保存,并且引入了 xlwt模塊以excel形式保存數(shù)據(jù)。
首先,得到詳情頁(yè)的url,隨機(jī)獲取一個(gè)瀏覽器的表頭,將獲取的瀏覽器信息賦給agant_chose,其核心代碼是agant_chose = random.choice(agant)
其次,確定要爬取天氣數(shù)據(jù)的城市,作者以是衡陽(yáng)、咸陽(yáng)、西安、成都、廣州5個(gè)城市為例,進(jìn)行7天天氣數(shù)據(jù)的爬取。爬取天氣數(shù)據(jù)的核心代碼是:html=etree.HTML(data.text)
first_weather=html.xpath(‘/html/body/div[5]/div[1]/div[1]/div[2]/ul/li[1]/p[1]/text()’)。上述代碼只是對(duì)某個(gè)節(jié)點(diǎn)的數(shù)據(jù)的爬取,而讀者可以根據(jù)自己想要的數(shù)據(jù)所處的位置編寫(xiě)代碼來(lái)爬取自己想要的節(jié)點(diǎn)或節(jié)點(diǎn)集數(shù)據(jù)。根據(jù)代碼所寫(xiě)的html路徑所選取的節(jié)點(diǎn)依次將爬取的近7天的天氣數(shù)據(jù)進(jìn)行保存。數(shù)據(jù)爬取過(guò)程如圖2所示。
圖2 爬取數(shù)據(jù)的過(guò)程
利用python語(yǔ)言中帶的xwlt模塊和matplotib模塊將保存的數(shù)據(jù)進(jìn)行可視化處理,讓數(shù)據(jù)可以用折線圖和Excel表格形式保存,讓數(shù)據(jù)變得更加生動(dòng)形象并且能夠更好地利用。將爬取的天氣數(shù)據(jù)寫(xiě)入excel文件,核心代碼是excelpath=(‘{}.xls’.format(city_name[number])
Workbook=xlwt.Workbook(encoding=’utf-8’)。將數(shù)據(jù)用圖片的形式保存的核心代碼是pyplot.plot(x,highest_temperature)
pyplot.plot(x, lowest_temperature),以西安為例的excel表格的部分?jǐn)?shù)據(jù)如圖3所示。
圖3 以excel形式保存的部分天氣數(shù)據(jù)(西安)
本文介紹了利用XPath爬取網(wǎng)頁(yè)數(shù)據(jù)的相關(guān)原理,并爬取了一些天氣數(shù)據(jù)。利用XPath爬取網(wǎng)頁(yè)數(shù)據(jù)簡(jiǎn)單而且靈活,相對(duì)于使用正則表達(dá)式稍簡(jiǎn)單,可以在知道數(shù)據(jù)爬取的HTML位置或者是爬取的數(shù)據(jù)的網(wǎng)頁(yè)位置相對(duì)固定的情況下使用,適合剛接觸Python爬蟲(chóng)的人。在爬蟲(chóng)開(kāi)發(fā)中,為追求高效可以?xún)?yōu)先選擇正則表達(dá)式。