訂經(jīng)濟(jì)型酒店網(wǎng)站數(shù)據(jù)采集與分析_第1頁
訂經(jīng)濟(jì)型酒店網(wǎng)站數(shù)據(jù)采集與分析_第2頁
訂經(jīng)濟(jì)型酒店網(wǎng)站數(shù)據(jù)采集與分析_第3頁
訂經(jīng)濟(jì)型酒店網(wǎng)站數(shù)據(jù)采集與分析_第4頁
訂經(jīng)濟(jì)型酒店網(wǎng)站數(shù)據(jù)采集與分析_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

目錄

1引言1

1.1項(xiàng)目背景1

1.2開發(fā)環(huán)境與工具1

1.2.1Python簡(jiǎn)介1

1.2.2Requests簡(jiǎn)介2

2需求分析2

2.1可行性需求分析2

2.2采集目標(biāo)功能分析2

2.3關(guān)鍵技術(shù)分析3

2.3.1網(wǎng)絡(luò)爬蟲技術(shù)3

2.3.2文件存取技術(shù)3

2.3.3可視化技術(shù)3

3數(shù)據(jù)采集3

3.1采集頁面分析3

3.2字段分析7

3.3編程實(shí)現(xiàn)9

4數(shù)據(jù)清洗與處理10

4.1數(shù)據(jù)清洗說明10

4.2數(shù)據(jù)清洗10

4.3編程實(shí)現(xiàn)12

5數(shù)據(jù)統(tǒng)計(jì)與分析13

5.1數(shù)據(jù)準(zhǔn)備13

5.2數(shù)據(jù)展示14

5.2.1統(tǒng)計(jì)每個(gè)省份的酒店數(shù)量和平均價(jià)格14

5.2.2統(tǒng)計(jì)各星級(jí)的酒店數(shù)量15

5.2.3統(tǒng)計(jì)各星級(jí)的酒店平均價(jià)格17

5.2.4統(tǒng)計(jì)各星級(jí)酒店的評(píng)價(jià)數(shù)18

I

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

5.2.5統(tǒng)計(jì)每個(gè)城市的酒店平均價(jià)格19

5.3綜述21

6小結(jié)21

參考資料22

II

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

訂經(jīng)濟(jì)型酒店網(wǎng)站數(shù)據(jù)采集與分析

1引言

隨著信息技術(shù)的迅猛發(fā)展和應(yīng)用,數(shù)據(jù)分析在各個(gè)行業(yè)中發(fā)揮著越來越重

要的作用,酒店業(yè)也不例外。酒店作為旅游業(yè)的重要組成部分,在面臨越來越

激烈的市場(chǎng)競(jìng)爭(zhēng)的同時(shí),也需要借助數(shù)據(jù)分析技術(shù)來提高其競(jìng)爭(zhēng)力。

酒店數(shù)據(jù)分析是通過對(duì)酒店各個(gè)方面的數(shù)據(jù)進(jìn)行收集、整理、分析和利用,

來獲取有效信息、提高經(jīng)營(yíng)效率、優(yōu)化服務(wù)質(zhì)量和增強(qiáng)競(jìng)爭(zhēng)力的一種手段。通

過數(shù)據(jù)分析,酒店可以了解客戶需求、習(xí)慣和行為,優(yōu)化客房管理和資源利用,

降低成本費(fèi)用,增加客戶滿意度和忠誠(chéng)度,提高市場(chǎng)競(jìng)爭(zhēng)力和經(jīng)營(yíng)效率。

1.1項(xiàng)目背景

隨著全球經(jīng)濟(jì)的發(fā)展和人民生活水平的提高,旅游業(yè)成為了一個(gè)快速增長(zhǎng)

的行業(yè)。酒店作為旅游業(yè)中不可或缺的組成部分,面臨著越來越激烈的市場(chǎng)競(jìng)

爭(zhēng)。為了更好地滿足客戶需求、提高服務(wù)質(zhì)量、優(yōu)化經(jīng)營(yíng)管理等方面的需要,

酒店需要利用數(shù)據(jù)分析技術(shù)來提高其競(jìng)爭(zhēng)力。

在數(shù)據(jù)分析的過程中,酒店需要借助各種技術(shù)工具,如數(shù)據(jù)挖掘、數(shù)據(jù)可視

化、機(jī)器學(xué)習(xí)、人工智能等,來對(duì)數(shù)據(jù)進(jìn)行處理和分析,從而得出有價(jià)值的信

息和結(jié)論。同時(shí),數(shù)據(jù)分析也需要借助專業(yè)人員的知識(shí)和經(jīng)驗(yàn),進(jìn)行數(shù)據(jù)解讀、

指導(dǎo)決策和實(shí)踐應(yīng)用。

總之,酒店數(shù)據(jù)分析是酒店業(yè)提高經(jīng)營(yíng)效率、優(yōu)化服務(wù)質(zhì)量、降低成本費(fèi)用

和增強(qiáng)競(jìng)爭(zhēng)力的重要手段,也是未來酒店業(yè)發(fā)展的趨勢(shì)之一。

1.2開發(fā)環(huán)境與工具

數(shù)據(jù)采集:python、selenium、etree、Xpath、re

數(shù)據(jù)清洗與分析:Hadoop、Mapreduce、yarn、hive、SQL

數(shù)據(jù)可視化:matplotlib

1.2.1Python簡(jiǎn)介

Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì)的吉多·范羅蘇姆1990年代初

設(shè)計(jì),作為一門叫做ABC語言的替代品。Python提供了高效的高級(jí)數(shù)據(jù)結(jié)構(gòu),

還能簡(jiǎn)單有效地面向?qū)ο缶幊?。Python語法和動(dòng)態(tài)類型,以及解釋型語言的本

1

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

質(zhì),使它成為多數(shù)平臺(tái)上寫腳本和快速開發(fā)應(yīng)用的編程語言,隨著版本的不斷

更新和語言新功能的添加,逐漸被用于獨(dú)立的、大型項(xiàng)目的開發(fā)。Python解釋

器易于擴(kuò)展,擴(kuò)展新的功能和數(shù)據(jù)類型。Python也可用于可定制化軟件中的擴(kuò)

展程序語言。Python豐富的標(biāo)準(zhǔn)庫(kù),提供了適用于各個(gè)主要系統(tǒng)平臺(tái)的源碼或

機(jī)器碼。

1.2.2Requests簡(jiǎn)介

Requests是一個(gè)很實(shí)用的PythonHTTP客戶端庫(kù),編寫爬蟲和測(cè)試服務(wù)器響

應(yīng)數(shù)據(jù)時(shí)經(jīng)常會(huì)用到,Requests是Python語言的第三方的庫(kù),專門用于發(fā)送

HTTP請(qǐng)求Requests響應(yīng)。

2需求分析

2.1可行性需求分析

從技術(shù)角度來看,酒店數(shù)據(jù)采集與分析的項(xiàng)目技術(shù)可行性非常高。以下是一

些技術(shù)分析:Requests:通過使用requests庫(kù)進(jìn)行數(shù)據(jù)采集,可以非常方便地

獲取網(wǎng)站上的信息,實(shí)現(xiàn)自動(dòng)化爬蟲程序。requests庫(kù)使用方便,功能強(qiáng)大,

是進(jìn)行網(wǎng)頁數(shù)據(jù)采集的重要工具。Hadoop:通過使用Hadoop技術(shù),可以快速高

效地對(duì)大規(guī)模數(shù)據(jù)進(jìn)行處理,使得數(shù)據(jù)分析更加快捷、準(zhǔn)確。Hadoop在分布式

存儲(chǔ)、分布式計(jì)算、MapReduce等方面表現(xiàn)突出,具有高可擴(kuò)展性、高可靠性等

優(yōu)點(diǎn)。Matplotlib:Matplotlib是Python的一個(gè)繪圖庫(kù),可以實(shí)現(xiàn)各種類型的

圖表繪制。通過使用Matplotlib,可以對(duì)數(shù)據(jù)進(jìn)行可視化展示,幫助用戶更加

直觀地理解數(shù)據(jù),方便數(shù)據(jù)分析與決策。

成本和效益分析:對(duì)于采集和分析所需的成本進(jìn)行分析,以及對(duì)分析結(jié)果

帶來的效益進(jìn)行評(píng)估,以確定項(xiàng)目的可行性。合規(guī)要求:考慮數(shù)據(jù)采集和分析

過程中的法律法規(guī)和隱私保護(hù)等合規(guī)要求,以確保項(xiàng)目的合法合規(guī)性。

2.2采集目標(biāo)功能分析

本次項(xiàng)目的數(shù)據(jù)集的來源是經(jīng)濟(jì)型酒店網(wǎng)站,是通過python爬取該網(wǎng)站所

有的酒店的信息。數(shù)據(jù)采集到了16萬多條記錄,爬取完成后盡可能的檢查數(shù)據(jù)

的準(zhǔn)確性,確定爬取出來的數(shù)據(jù)無誤并且是屬于經(jīng)濟(jì)型酒店網(wǎng)站中的酒店信息。

分析網(wǎng)站結(jié)構(gòu)確定需要采集的字段有城市名稱、酒店類型、酒店名稱、酒

店地址、酒店價(jià)格、酒店評(píng)價(jià)數(shù)、酒店簡(jiǎn)介等字段。后續(xù)根據(jù)采集到的字段進(jìn)

2

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

行多維度的數(shù)據(jù)分析。

2.3關(guān)鍵技術(shù)分析

2.3.1網(wǎng)絡(luò)爬蟲技術(shù)

網(wǎng)絡(luò)爬蟲(Webcrawler)是一種自動(dòng)化程序,能夠從互聯(lián)網(wǎng)上收集信息。

它通過訪問網(wǎng)頁并分析網(wǎng)頁內(nèi)容,從中抓取有用的數(shù)據(jù),并將這些數(shù)據(jù)存儲(chǔ)在

本地或遠(yuǎn)程服務(wù)器上。這些數(shù)據(jù)可以包括文本、圖像、視頻、音頻、鏈接等等。

爬蟲可以用于各種用途,如搜索引擎、數(shù)據(jù)挖掘、網(wǎng)站監(jiān)控、機(jī)器學(xué)習(xí)等領(lǐng)域。

爬蟲技術(shù)涉及到多個(gè)方面的知識(shí)和技能,包括編程語言、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)

結(jié)構(gòu)和算法等。常用的編程語言有Python、Java、JavaScript等,常見的網(wǎng)絡(luò)

協(xié)議有HTTP、HTTPS、FTP等。爬蟲可以使用多種方式來抓取網(wǎng)頁,如基于正則

表達(dá)式的文本匹配、XPath、CSS選擇器等方式。

為了避免爬蟲被網(wǎng)站攔截或者出現(xiàn)其他問題,爬蟲需要遵守一些規(guī)則和原

則,如合法使用robots.txt協(xié)議、設(shè)置爬蟲頭、設(shè)置訪問間隔時(shí)間等。此外,

還需要注意爬取數(shù)據(jù)的合法性和隱私保護(hù)等問題。

2.3.2文件存取技術(shù)

文件存儲(chǔ)主要使用json文件完成,json具有簡(jiǎn)單、易于閱讀、利于網(wǎng)絡(luò)傳

輸?shù)葍?yōu)點(diǎn),在大數(shù)據(jù)文件傳輸中應(yīng)用非常廣泛。

2.3.3可視化技術(shù)

Matplotlib是Python中最受歡迎的數(shù)據(jù)可視化軟件包之一,支持跨平臺(tái)運(yùn)

行,它是Python常用的2D繪圖庫(kù),同時(shí)它也提供了一部分3D繪圖接口。

3數(shù)據(jù)采集

3.1采集頁面分析

本次數(shù)據(jù)采集的目標(biāo)網(wǎng)站是“訂經(jīng)濟(jì)型酒店”網(wǎng)站,該網(wǎng)站包含

了全國(guó)各個(gè)城市所有的酒店信息,包括酒店所在城市、酒店地址、酒店類型、

房間價(jià)格等信息。該網(wǎng)站的首頁如下圖3-1所示:

3

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖3-1網(wǎng)站首頁

點(diǎn)擊下方酒店簡(jiǎn)略信息模塊的更多按鈕,即可跳轉(zhuǎn)到全國(guó)各個(gè)城市的選擇頁

面,城市按照首字母順序進(jìn)行排序,如下圖3-2所示:

圖3-2城市列表頁

4

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

隨機(jī)點(diǎn)擊其中的某個(gè)城市,即可跳轉(zhuǎn)到酒店信息列表頁,在酒店信息列表頁

中可以根據(jù)酒店的價(jià)格、類型等字段進(jìn)行篩選。每一頁最多有20行條記錄,可

以點(diǎn)擊下方的“下一頁”按鈕進(jìn)行翻頁。如下圖3-3所示:

圖3-3酒店信息列表頁

根據(jù)初略的網(wǎng)站頁面瀏覽,已經(jīng)基本清晰了網(wǎng)站的結(jié)構(gòu),后續(xù)在采集每個(gè)城

市每一個(gè)酒店信息時(shí),還需要考慮城市切換、翻頁等細(xì)節(jié)問題,在后面的小結(jié)

中會(huì)有詳細(xì)的介紹。

通過前一小結(jié)的采集頁面分析,已經(jīng)大致了解了網(wǎng)站頁面的切換順序,那么

只需要逐個(gè)對(duì)不同頁面url發(fā)起請(qǐng)求即可,請(qǐng)求的方式有post和get請(qǐng)求,通

過抓包工具分析得出,頁面的數(shù)據(jù)都是以get請(qǐng)求返回,如下圖3-4所示:

圖3-4抓包分析

首先對(duì)城市列表頁url發(fā)起get請(qǐng)求,通過etree庫(kù)解析html文檔,逐個(gè)

獲取每個(gè)城市酒店列表頁的href,在根據(jù)href拼接出完整的url,再逐個(gè)對(duì)酒

店列表頁url發(fā)起get請(qǐng)求,獲取其中的酒店字段。

對(duì)目標(biāo)url發(fā)起get請(qǐng)求,通過抓包工具可以看出響應(yīng)的html內(nèi)容,從中可以

發(fā)現(xiàn)所有城市href屬性和城市名稱都在class屬性為index_wrap的div標(biāo)簽

5

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

中,使用etree庫(kù)的HTML方法解析response響應(yīng),通過循環(huán)的方式逐一取出

城市href屬性和城市名稱,代碼如下圖3-5所:

圖3-5get_city_list方法

由于在酒店詳情頁中沒有所在城市的字段,所以需要將將城市href屬性和

城市名稱使用管道符號(hào)進(jìn)行拼接成組合串,這樣可以更好的將城市名稱字段傳

輸?shù)较掠纬绦蛑?,保證了數(shù)據(jù)的完整性。最后將組合串存儲(chǔ)到列表中,以供后

續(xù)代碼處理。

使用loop_city_list方法遍歷每個(gè)城市的組合串,解析其中的城市href屬

性,并拼接成完整的url串,最后調(diào)用get_hotel_star方法做后續(xù)的處理。詳

細(xì)代碼如下圖3-6所示:

圖3-6get_hotel_star方法

在酒店列表信息頁的選擇欄中有酒店星級(jí)的選項(xiàng),由于在酒店詳情頁中沒有

酒店星級(jí)字段,所以需要對(duì)選擇欄的各個(gè)星級(jí)url分別處理,以保存酒店的星

級(jí)字段。打開抓包分析工具,查看對(duì)應(yīng)的html文檔,找到酒店星級(jí)對(duì)應(yīng)的url,

如下圖3-7所示:

圖3-7酒店星級(jí)html文檔分析

利用xpath方法獲取div標(biāo)簽,獲取其中的a標(biāo)簽中的屬性和內(nèi)容。由于

“不限”級(jí)別包含了所有的星級(jí),在采集過程中如果不加以處理,會(huì)和后面的

6

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

各個(gè)星級(jí)重復(fù),所以”不限”級(jí)別需要剔除。使用get_hotel_star方法處理,

詳細(xì)代碼如下圖3-8所示:

圖3-8get_hotel_star方法

由于“不限”級(jí)別在列表中處理第一個(gè)位置,所以使用python的列表截取

方法即可剔除該級(jí)別。獲取到各個(gè)星級(jí)的href屬性之后,將其拼接成完整的url

串,并傳入到turn_page方法做后續(xù)處理。

3.2字段分析

每個(gè)酒店星級(jí)可能會(huì)有多個(gè)頁面,此時(shí)需要翻頁。在前面的采集頁面分析中

已經(jīng)知道,每個(gè)頁面最多只有20條記錄,如果頁面中的記錄少于20條,那么

該頁面是最后一頁,否則它不是最后一頁。根據(jù)這個(gè)規(guī)則可以制定出翻頁策略。

如果頁面有20條記錄那么它可能會(huì)有下一頁,此時(shí)需要構(gòu)造出下一個(gè)的url,

如果不足20條記錄那么它是最后一頁,則不需要翻頁。

使用turn_page方法進(jìn)行翻頁處理。詳細(xì)代碼如下圖3-9所示:

圖3-9turn_page方法

使用xpath方法獲取頁面記錄數(shù),判斷是否需要翻頁。在構(gòu)造翻頁url時(shí)有

兩種情況,第一種是從第1頁翻到下一頁,由于酒店信息列表頁的初始url不

包含翻頁參數(shù)p,所以在第一次翻頁時(shí)需要使用字符串方法添加參數(shù)p并傳入頁

7

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

數(shù);第二種情況時(shí)從非第1頁翻到下一頁,此時(shí)url中就已經(jīng)存在了p參數(shù),

在構(gòu)造下一頁url時(shí)則只需要修改p參數(shù)的值即可。如下圖3-10和3-11所示:

圖3-10第1頁url

圖3-11后續(xù)頁面url

從上面的圖片可以清晰的看到,圖3-8中的url比圖3-7中的url多了一個(gè)

p參數(shù)。在程序中通過調(diào)整p參數(shù)的值實(shí)現(xiàn)翻頁。

將獲取到的response響應(yīng)傳入到get_hotel_page方法中做酒店詳情字段

的獲取,以避免對(duì)相同頁面的重復(fù)請(qǐng)求,造成內(nèi)存資源浪費(fèi)。

通過對(duì)酒店詳情頁html文檔分析找到各個(gè)字段所在的標(biāo)簽:

圖3-12酒店字段html分析

使用get_hotel_page方法處理。詳細(xì)代碼如下圖3-13所示:

圖3-13get_hotel_page方法

Xpath方法的返回值是列表類型,需要使用join方法將列表轉(zhuǎn)換成字符串,

以方便后續(xù)字段的存儲(chǔ)。將所有字段傳入到save_hotel_fields方法中,對(duì)字

段進(jìn)行整理并落盤。

將所有字段保存到字典中,這里城市和酒店星級(jí)字段比較特殊,因?yàn)槭菑淖?/p>

初的采集程序中逐級(jí)傳遞過來的,在save_hotel_fields方法中和其他字段統(tǒng)

一整理。

在save_hotel_info方法中將數(shù)據(jù)保存成json格式,json格式有輕量、易

解析和便于網(wǎng)絡(luò)傳輸?shù)忍攸c(diǎn),能夠提高數(shù)據(jù)清洗與分析的效率。

save_hotel_info詳細(xì)代碼如下圖3-14所示

8

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖3-14save_hotel_info方法

調(diào)用json庫(kù)的dumps方法,指定忽略ascii碼參數(shù),將數(shù)據(jù)以u(píng)tf-8編碼

保存到gckzw.json文件中。

3.3編程實(shí)現(xiàn)

到此為止,所有的數(shù)據(jù)處理方法已經(jīng)全部編寫完成。在main方法中調(diào)用

get_city_list方法獲取城市信息列表,并傳入loop_city_list方法中即可啟

動(dòng)爬蟲程序。Main方法詳細(xì)如下圖3-15所示:

圖3-15main方法

數(shù)據(jù)采集程序所需要的python第三方庫(kù)如下所示:

importrequests

fromlxmlimportetree

importjson,re

運(yùn)行程序如下圖3-16所示:

圖3-16運(yùn)行main爬蟲程序

程序運(yùn)行結(jié)束之后會(huì)在當(dāng)前文件夾中生成gckzw.json,打開文件可以看到

采集了16萬多行記錄。其龐大的數(shù)據(jù)量為數(shù)據(jù)的多維度多角度分析帶來了正確

性,可以保證數(shù)據(jù)分析的客觀性和真實(shí)性。在后續(xù)的數(shù)據(jù)處理中將該文件上傳

到HDFS分布式文件系統(tǒng)做數(shù)據(jù)清洗和數(shù)據(jù)分析等處理。如下圖3-17所示:

9

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖3-17gckzw.json文件

4數(shù)據(jù)清洗與處理

4.1數(shù)據(jù)清洗說明

在實(shí)際的數(shù)據(jù)分析業(yè)務(wù)中,數(shù)據(jù)往往來自于不同業(yè)務(wù)系統(tǒng)或爬蟲系統(tǒng),這

樣會(huì)造成數(shù)據(jù)格式可能不統(tǒng)一。所以在獲得龐大的數(shù)據(jù)集之后需要對(duì)數(shù)據(jù)進(jìn)行

清洗和預(yù)處理,統(tǒng)一數(shù)據(jù)格式和剔除無效或有缺失數(shù)據(jù),這是大數(shù)據(jù)開發(fā)中不

可或缺的部分,保證了數(shù)據(jù)的一致性和正確性。這個(gè)對(duì)于信息質(zhì)量的評(píng)估是一

項(xiàng)很重要的任務(wù)。不僅如此,還需要將數(shù)據(jù)進(jìn)行有理化和有序化,這樣子能夠在

數(shù)據(jù)調(diào)用共享過程中方便很多開發(fā)人員對(duì)數(shù)據(jù)信息的使用。

本次項(xiàng)目數(shù)據(jù)清洗和分析使用Hadoop框架來完成。將爬取下來的數(shù)據(jù)存儲(chǔ)到分

布式文件系統(tǒng)HDFS中,通過分析和觀察原始數(shù)據(jù),制定合理的數(shù)據(jù)清洗規(guī)則,

并利用分布式計(jì)算引擎mapreduce讀取和處理數(shù)據(jù)。

4.2數(shù)據(jù)清洗

創(chuàng)建JSONObject對(duì)象,解析json串根據(jù)key值獲取對(duì)應(yīng)的value值;處理

hotel_price字段,剔除價(jià)格單位符號(hào)‘¥’。比如‘¥416.00’處理之后為

‘416.00‘,這樣做的目的是便于后續(xù)對(duì)價(jià)格字段的計(jì)算和分析;處理

hotel_intro字段,剔除其中的‘簡(jiǎn)介’和特殊符號(hào)等信息。比如‘簡(jiǎn)介:

\u3000\u3000柞水恒隆旅社位于下梁鎮(zhèn)街道東側(cè),交通十分便利?!幚碇?/p>

10

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

為‘柞水恒隆旅社位于下梁鎮(zhèn)街道東側(cè),交通十分便利。’,這樣可以在精簡(jiǎn)

內(nèi)容時(shí)保證了數(shù)據(jù)的完整性,可以增加磁盤的存儲(chǔ)利用率。

根據(jù)city_name字段,查詢中國(guó)省份編碼表,找到城市對(duì)應(yīng)的省份和省份編

碼,以便于后續(xù)繪制省份酒店數(shù)量分布圖。

編寫cleanPrice方法處理清洗價(jià)格字段,使用字符串方法replace方法剔

除人民幣符號(hào),使加個(gè)字段規(guī)整化。詳細(xì)代碼如下圖4-1所示:

圖4-1cleanPrice方法

簡(jiǎn)介字段有兩種情況需要處理,第一種是剔除“簡(jiǎn)介”和“:”等字符串,

第二種是剔除其中的特殊符號(hào),如“\u3000\u3000”和“\n”,其中換行符的

處理尤為重要,否則會(huì)導(dǎo)致結(jié)果文件出現(xiàn)大量的無效行。編寫cleanIntro方法

完成清洗操作,主要使用字符串的replace方法將無效字符替換成空串。詳細(xì)

代碼如下圖4-2所示:

圖4-2cleanIntro方法

為了便于后續(xù)繪制省份酒店數(shù)量地圖,需要添加省份編碼字段。具體方法為,

查詢中國(guó)省份編碼表,將其緩存到內(nèi)存中,再根據(jù)城市名稱查詢對(duì)應(yīng)的省份和

省份編碼。在mapreduce程序中,setup在程序啟動(dòng)時(shí)執(zhí)行一次,所以緩存省份

編碼的操作需要放在該方法中,在map方法中對(duì)每一行的城市名稱字段查詢都

需要查詢一次省份編碼。

在setup方法中創(chuàng)建BufferedReader對(duì)象讀取目標(biāo)文件,將內(nèi)容緩存到

hashmap中。由于省份編碼表中的城市字段包含了”市、地區(qū)”等字符,而原始

數(shù)據(jù)文件中的該字段沒有”市、地區(qū)”等字符,為了保證在hashmap中能夠準(zhǔn)

確的查詢到對(duì)應(yīng)的省份和編碼,需要對(duì)”市、地區(qū)”等字符剔除,保證數(shù)據(jù)的

一致性。

在map方法中調(diào)用getProvinceAndCode查詢省份編碼hashmap表,并將省

份編碼格式化為標(biāo)準(zhǔn)編碼。詳細(xì)代碼如下圖4-3所示:

11

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖4-3getProvinceAndCode方法

數(shù)據(jù)清洗完畢之后,將所有字段按照逗號(hào)進(jìn)行拼接,以方便后續(xù)將數(shù)據(jù)導(dǎo)入

hive表進(jìn)行數(shù)據(jù)分析。字段拼接操作主要通過connect方法來實(shí)現(xiàn)。詳細(xì)代碼

如下圖4-4所示:

圖4-4connect方法

主要思想:使用可變參數(shù),將所有的字段統(tǒng)一的傳入,使用for循環(huán)遍歷,

逐個(gè)添加到stringBuilder對(duì)象后,拼接完成之后,在每一行的最后會(huì)多出一

個(gè)逗號(hào),所以在返回的時(shí)候要將這個(gè)多余的逗號(hào)剔除。這里不使用String類的

原因是因?yàn)镾tring對(duì)象不可變,在拼接過程中會(huì)產(chǎn)生大量無用字符串,消耗大

量?jī)?nèi)存,所以這里使用StringBuilder對(duì)象。

4.3編程實(shí)現(xiàn)

所有的處理邏輯編寫完成之后,就需要在main方法中調(diào)用這些處理邏輯類

了。main方法詳細(xì)代碼如下圖4-5所示:

12

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖4-5main方法

在main方法中創(chuàng)建Configuration對(duì)象,設(shè)置輸入輸出目錄、輸入輸出數(shù)

據(jù)類型等參數(shù)。最后即可運(yùn)行mapreduce程序。運(yùn)行關(guān)鍵日志如下圖4-6所示:

圖4-6mapreduce運(yùn)行日志

mapreduce程序運(yùn)行結(jié)束后,會(huì)在指定的目錄下生成output文件夾,其中

part-r-00000就是數(shù)據(jù)清洗的結(jié)果。如下圖4-7所示:

圖4-7output文件夾

5數(shù)據(jù)統(tǒng)計(jì)與分析

5.1數(shù)據(jù)準(zhǔn)備

獲取到統(tǒng)一規(guī)整的數(shù)據(jù)后就可以進(jìn)行數(shù)據(jù)分析了。數(shù)據(jù)分析基于mapreduce

分布式計(jì)算引擎有兩次方式,第一種是直接編寫mapreduce程序進(jìn)行數(shù)據(jù)分析,

這種方式比較靈活,但是比較復(fù)雜繁瑣;第二種是將數(shù)據(jù)導(dǎo)入到hive中,并利

13

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

用其類SQL語言進(jìn)行數(shù)據(jù)分析,hiveSQL的底層實(shí)際上也是mapreduce程序,

hive可以將SQL翻譯成mapreduce程序并運(yùn)行,這種方式比較簡(jiǎn)單,并且也可

以進(jìn)行復(fù)雜的數(shù)據(jù)分析。

根據(jù)原始數(shù)據(jù)創(chuàng)建對(duì)應(yīng)的hive表,表結(jié)構(gòu)如下圖所示:

圖5-1查看數(shù)據(jù)導(dǎo)入情況

使用hive提供的load語句將數(shù)據(jù)導(dǎo)入,后續(xù)根據(jù)SQL語句進(jìn)行數(shù)據(jù)分析。

導(dǎo)入命令運(yùn)行結(jié)果如下圖所示:

圖5-2load數(shù)據(jù)導(dǎo)入

5.2數(shù)據(jù)展示

5.2.1統(tǒng)計(jì)每個(gè)省份的酒店數(shù)量和平均價(jià)格

統(tǒng)計(jì)每個(gè)省份的酒店數(shù)量和平均價(jià)格,需要根據(jù)省份編碼字段和省份名稱字

段進(jìn)行分組,對(duì)每個(gè)省份的酒店數(shù)量求和,并計(jì)算酒店平均價(jià)格,為了保證數(shù)

據(jù)的可讀性,這里將平均價(jià)格保留兩位小數(shù)。Sql代碼如下所示:

selectcode,province,count(city),round(avg(hotel_price),2)

fromhotel_info

wherecodelike'CN%'

groupbycode,province

orderbyround(avg(hotel_price),2)desc

運(yùn)行結(jié)果如下圖5-3所示:

14

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖5-3統(tǒng)計(jì)每個(gè)省份的酒店數(shù)量和平均價(jià)格

根據(jù)數(shù)據(jù)分析結(jié)果繪制地圖,將數(shù)據(jù)分析結(jié)果通過hive導(dǎo)出成文件,使用

python的pyecharts庫(kù)繪制中國(guó)省份地圖。詳細(xì)代碼如下所示:

importpandasaspd

frompyechartsimportoptionsasopts

frompyecharts.chartsimportMap

df=pd.read_csv(r'D:\酒店數(shù)據(jù)采集與分析\可視化文件\result1.txt',sep='\t',header=None)

df.columns=['code','name','data','price']

map_chart=Map()map_chart.add('',[list(z)forzinzip(df['name'],df['data'])],'china')

map_chart.set_global_opts(title_opts=opts.TitleOpts(title='酒店數(shù)據(jù)地圖'),

visualmap_opts=opts.VisualMapOpts(max_=max(df['data'])))map_chart.render('map.html')

程序運(yùn)行結(jié)果如下所示:

圖5-4中國(guó)各省份酒店數(shù)據(jù)地圖

5.2.2統(tǒng)計(jì)各星級(jí)的酒店數(shù)量

統(tǒng)計(jì)各星級(jí)的酒店數(shù)量,對(duì)酒店星級(jí)字段分組,并使用count函數(shù)求和。Sql

代碼如下所示:

selecthotel_star_name,count(1)

fromhotel_info

wherehotel_star_namein('經(jīng)濟(jì)型','二星級(jí)','三星級(jí)','四星級(jí)','五星級(jí)')

groupbyhotel_star_name

15

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

運(yùn)行結(jié)果如下圖5-5所示:

圖5-5統(tǒng)計(jì)各星級(jí)的酒店數(shù)量

在代碼中,從指定的文本文件中讀取數(shù)據(jù),并將其分別存儲(chǔ)在labels和

sizes列表中。接著,使用plt.pie函數(shù)繪制餅圖,并傳遞labels和sizes作

為參數(shù)。其中,autopct='%1.1f%%'表示顯示百分比的格式為保留一位小數(shù)。

shadow=False表示不顯示陰影,startangle=150表示旋轉(zhuǎn)餅圖的起始角度為

150度。最后,使用plt.title函數(shù)添加標(biāo)題,并使用plt.show函數(shù)顯示餅圖。

圖5-6統(tǒng)計(jì)各星級(jí)的酒店數(shù)量

將每個(gè)酒店星級(jí)進(jìn)行分組聚合統(tǒng)計(jì)出每個(gè)星級(jí)酒店的數(shù)量,如上圖可以看出

經(jīng)濟(jì)型酒店的占比要遠(yuǎn)遠(yuǎn)高于其他星級(jí)的酒店,其次是二星級(jí)酒店,從餅圖中

可以清晰的看出星級(jí)越高其酒店數(shù)量就會(huì)越少。說明了經(jīng)濟(jì)型酒店更受大眾歡

迎,雖然價(jià)格相對(duì)來說比較低,但是龐大的數(shù)量的數(shù)量帶來的經(jīng)濟(jì)效益也是不

可估量的,有著薄利多銷的特點(diǎn);星級(jí)酒店的數(shù)量較少,符合了經(jīng)濟(jì)學(xué)的特點(diǎn),

主要的訂購(gòu)對(duì)象一般都是商務(wù)人群。

16

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

5.2.3統(tǒng)計(jì)各星級(jí)的酒店平均價(jià)格

統(tǒng)計(jì)各星級(jí)的酒店的平均價(jià)格,對(duì)酒店星級(jí)字段分組,使用avg函數(shù)求平均

數(shù)并用round函數(shù)保留兩位小數(shù)。Sql代碼如下所示:

selecthotel_star_name,round(avg(hotel_price))

fromhotel_info

wherehotel_star_namein('經(jīng)濟(jì)型','二星級(jí)','三星級(jí)','四星級(jí)','五星級(jí)')

groupbyhotel_star_name

運(yùn)行結(jié)果如下圖5-7所示:

圖5-7統(tǒng)計(jì)各星級(jí)的酒店平均價(jià)格

通過讀取指定文件的數(shù)據(jù)進(jìn)行繪圖。首先,使用plt.rcParams來設(shè)置字體,

然后從指定文件中讀取數(shù)據(jù),使用readlines()函數(shù)讀取每一行數(shù)據(jù),然后通過

split()函數(shù)來分割每一行數(shù)據(jù),獲取標(biāo)簽和數(shù)據(jù)的值。接下來,使用plt.bar()

函數(shù)將數(shù)據(jù)繪制成條形圖,其中tick_label參數(shù)指定標(biāo)簽的位置,rotation參

數(shù)設(shè)置標(biāo)簽的旋轉(zhuǎn)角度,title函數(shù)設(shè)置圖表的標(biāo)題,最后使用plt.show()函

數(shù)展示圖表。這段代碼的目的是繪制各星級(jí)酒店的平均價(jià)格的條形圖,方便比

較各星級(jí)酒店的價(jià)格水平。

運(yùn)行結(jié)果展示如下:

17

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖5-8統(tǒng)計(jì)各星級(jí)的酒店平均價(jià)格

該柱狀圖展示了各星級(jí)酒店的平均價(jià)格,其中五星級(jí)酒店的價(jià)格最高,經(jīng)濟(jì)

型酒店的價(jià)格最低,一般來說,價(jià)值是價(jià)格的基礎(chǔ),價(jià)格是價(jià)值的貨幣表現(xiàn),

價(jià)值應(yīng)等同于價(jià)格。但在實(shí)際市場(chǎng)交換中,單個(gè)商品的價(jià)格與價(jià)值很少趨于一

致,價(jià)格與價(jià)值總是相互背離的,而這種背離又總是以價(jià)值為中心,進(jìn)行上下

波動(dòng)的。從較長(zhǎng)時(shí)期和總的趨勢(shì)來看,這種背離不會(huì)太久,由于價(jià)格總是圍繞

價(jià)值上下波動(dòng),所以產(chǎn)品的總價(jià)格仍與總價(jià)值相等。因此企業(yè)在制定和調(diào)整價(jià)

格時(shí)應(yīng)以產(chǎn)品的價(jià)值為基礎(chǔ),使價(jià)格大體上符合價(jià)值,而不能背離太遠(yuǎn),這樣

才符合價(jià)值規(guī)律的要求。商品價(jià)格的高低,主要由商品中包含的價(jià)值量的大小

決定。但從市場(chǎng)營(yíng)銷的角度看,商品的價(jià)格除了受價(jià)值量的影響之外,還要受

其他諸多因素的影響。

5.2.4統(tǒng)計(jì)各星級(jí)酒店的評(píng)價(jià)數(shù)

統(tǒng)計(jì)各星級(jí)酒店的評(píng)價(jià)數(shù),對(duì)酒店星級(jí)字段分組,使用sum函數(shù)對(duì)評(píng)價(jià)數(shù)進(jìn)

行匯總,Sql代碼如下所示:

selecthotel_star_name,sum(comment)

fromhotel_info

wherehotel_star_namein('經(jīng)濟(jì)型','二星級(jí)','三星級(jí)','四星級(jí)','五星級(jí)')

groupbyhotel_star_name

運(yùn)行結(jié)果如下圖5-9所示:

圖5-9統(tǒng)計(jì)各星級(jí)酒店的評(píng)價(jià)數(shù)

通過柱狀圖展示每年各星級(jí)酒店的評(píng)價(jià)數(shù)。代碼中首先使用了numpy和

matplotlib庫(kù)進(jìn)行導(dǎo)入,并且設(shè)置了中文字體為SimHei。接著使用withopen

打開txt文件,將文件中的數(shù)據(jù)讀入到列表x和y中,x為年份,y為對(duì)應(yīng)的評(píng)

價(jià)數(shù)。然后使用plt.bar()函數(shù)繪制柱狀圖,設(shè)置alpha參數(shù)控制柱子的透明度,

width參數(shù)設(shè)置柱子的寬度,color和edgecolor參數(shù)分別控制柱子和邊框的顏

色。同時(shí)使用label參數(shù)設(shè)置圖例的標(biāo)簽,lw參數(shù)設(shè)置線寬。接著使用

plt.legend()設(shè)置圖例的位置,并使用plt.title()設(shè)置圖表的標(biāo)題。最后使用

plt.xticks()函數(shù)設(shè)置x軸的刻度和標(biāo)簽,并通過rotation參數(shù)設(shè)置標(biāo)簽的傾

斜角度。最后使用plt.show()展示圖表。

18

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

運(yùn)行結(jié)果展示如下:

圖5-10統(tǒng)計(jì)各星級(jí)酒店的評(píng)價(jià)數(shù)

從上圖可以發(fā)現(xiàn)經(jīng)濟(jì)型酒店的平均數(shù)最高,從側(cè)面反映了經(jīng)濟(jì)型酒店的入住

率較高,由于經(jīng)濟(jì)型酒店比一般星級(jí)酒店費(fèi)用低、服務(wù)標(biāo)準(zhǔn)統(tǒng)一,所以經(jīng)濟(jì)型

酒店的入住率一般可以達(dá)到90%以上。實(shí)惠的價(jià)格享受到更加高品質(zhì)的服務(wù)適

合眾多商旅人士,自然成為消費(fèi)者入住之地。

5.2.5統(tǒng)計(jì)每個(gè)城市的酒店平均價(jià)格

統(tǒng)計(jì)每個(gè)城市的酒店平均價(jià)格,需要對(duì)城市名稱字段進(jìn)行分組,使用avg函

數(shù)對(duì)價(jià)格求平均數(shù),并取平均價(jià)格最高的10個(gè)城市。Sql代碼如下所示:

selectcity,round(avg(hotel_price))

fromhotel_info

wherecityisnotnull

groupbycity

orderbyround(avg(hotel_price))desc

limit10

運(yùn)行結(jié)果如下圖5-11所示:

19

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖5-11統(tǒng)計(jì)每個(gè)城市的酒店平均價(jià)格

首先通過open()函數(shù)以只讀方式打開指定路徑下的文件,讀取其中的內(nèi)容,

并將其賦值給變量lines。然后,使用for循環(huán)遍歷每一行數(shù)據(jù),通過split()方法

將每一行數(shù)據(jù)按照指定的分隔符切分成多個(gè)子字符串,并將其存儲(chǔ)到labels和

sizes兩個(gè)列表中。

接下來,使用plt.bar()函數(shù)繪制柱狀圖,其中第一個(gè)參數(shù)為柱子的位置,使

用ran

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論