自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用Python偷偷告訴你國(guó)慶8億人都去哪兒浪?

原創(chuàng)
開發(fā) 后端 開發(fā)工具
祖國(guó) 70 周年的華誕一天天臨近,各行各業(yè)都在為祖國(guó)母親慶祝生日。作為一個(gè) IT 人,也想貢獻(xiàn)一份綿薄之力。

【51CTO.com原創(chuàng)稿件】祖國(guó) 70 周年的華誕一天天臨近,各行各業(yè)都在為祖國(guó)母親慶祝生日。作為一個(gè) IT 人,也想貢獻(xiàn)一份綿薄之力。

?[[278158]]?

圖片來(lái)自 Pexels

據(jù)文化和旅游部消息稱,預(yù)計(jì) 2019 年國(guó)慶旅游人次有望達(dá)到近 8 億。

?[[278159]]?

#國(guó)慶假期或有近 8 億人次出游#這個(gè)話題還沖上了微博熱搜榜。

??

我仿佛已經(jīng)看到了假期景區(qū)人山人海的畫面!

??

??

左思右想,最后落腳到國(guó)慶長(zhǎng)假的旅游上,能否用網(wǎng)絡(luò)爬蟲看看,十一長(zhǎng)假哪些城市最堵?哪些景區(qū)最熱門?


?[[278162]]?

今天一起來(lái)看看,如何利用網(wǎng)絡(luò)爬蟲生成國(guó)慶期間的旅游熱點(diǎn)圖吧。

需求構(gòu)思

制作一張旅游熱點(diǎn)圖,我們想要達(dá)到的效果是,在一張中國(guó)地圖上面標(biāo)注出旅游熱點(diǎn)。

通過(guò)這張圖可以知道哪些城市,或者哪些區(qū)域是十一期間的旅游熱點(diǎn)。也就是說(shuō)哪些地方在國(guó)慶期間去玩的人多。

??

構(gòu)思圖

首先,我們要找一個(gè)數(shù)據(jù)源能夠獲取全國(guó)旅游信息。這里有一個(gè)思路就是訂票信息,哪些景點(diǎn)的訂票比較多,那么這些景點(diǎn)所在的城市就越熱門。類似的售票網(wǎng)站比較多,例如:攜程,去哪兒,途牛旅游之類的。

然后,需要分析網(wǎng)站上面的票務(wù)數(shù)據(jù),將我們感興趣的旅游熱點(diǎn)信息爬取下來(lái)。分析信息的重點(diǎn)是針對(duì)網(wǎng)頁(yè) HTML 信息的解析。

之后,將分析完畢的信息按照一定格式保存到本地,由于下載的信息可能和最終展示信息存在偏差,所以需要做一些數(shù)據(jù)清洗和數(shù)據(jù)聚合的操作。

最后,將整理好的信息輸入到地圖上顯示出來(lái),這也是最后展示的環(huán)節(jié)。這里可以選擇對(duì)外展示的方式,例如:點(diǎn)圖,線圖,或者熱力圖。

網(wǎng)站分析

全局預(yù)覽

找了一圈旅游網(wǎng)站以后,發(fā)現(xiàn)在“去哪兒”的門票頁(yè)面中,有一個(gè)對(duì)旅游景點(diǎn)熱度的展示信息。

網(wǎng)頁(yè)會(huì)根據(jù)不同類型景點(diǎn)(自然風(fēng)光,文化古跡等)進(jìn)行查詢,查詢的結(jié)果會(huì)顯示景點(diǎn)名稱,景點(diǎn)熱度和城市信息。

如果我們將這些景點(diǎn)對(duì)應(yīng)的區(qū)域的熱度進(jìn)行匯總,就可以知道哪些區(qū)域?qū)?yīng)的景點(diǎn)熱度了。

先打開去哪兒旅游,搜索“熱門景點(diǎn)”。下面列出了各個(gè)地方的熱門旅游景點(diǎn)。

??

針對(duì)景點(diǎn)主題做了分類,在展示的列表中,有景點(diǎn)名稱,景點(diǎn)級(jí)別,所在省市,以及熱度。其中省市和熱點(diǎn)是我們關(guān)心的數(shù)據(jù)。

URL 分析

??

URL 分析圖

打開 Chrome 的開發(fā)者工具來(lái)看看 HTML 頁(yè)面的結(jié)構(gòu)。URL 的規(guī)律很容易能夠看明白:

  • Keyword 就是“熱門景點(diǎn)”,它是個(gè)常量,每次請(qǐng)求填寫這個(gè)就行了。
  • Subject 是景點(diǎn)分類,例如:自然風(fēng)光,游樂(lè)場(chǎng),文化古跡等等。這個(gè)需要一一羅列出來(lái),是在一個(gè)變量后面用數(shù)組存放。
  • Page 是頁(yè)數(shù),如果我們要爬取所有的信息,需要一頁(yè)一頁(yè)往下翻,所以這個(gè)數(shù)字會(huì)不斷增長(zhǎng)。頁(yè)面滑動(dòng)到最下方的時(shí)候,會(huì)看到 Next 按鈕,可以通過(guò)這個(gè)按鈕將所有頁(yè)面都遍歷到。

??

URL 全景圖

頁(yè)面元素分析

通過(guò) Chrome 開發(fā)者工具中的元素選擇器,可以清楚地看到元素的 HTML 標(biāo)簽。

??

列表元素圖

由于景點(diǎn)信息放在一個(gè)列表中,所以找到列表所在的元素,它放在 id 為“search-list”的 div 中。

也就是說(shuō)在請(qǐng)求 URL 并獲取 HTML 之后,我就需要找到“search-list”div 并且獲取其中對(duì)應(yīng)的項(xiàng)目信息。

獲取了列表元素之后,再來(lái)看看每一項(xiàng)旅游紀(jì)錄中的值如何獲取。其內(nèi)容放在”sight_item”的 div 中。

??

列表中每項(xiàng)的示意圖

接下來(lái)分別將景點(diǎn)名稱,景點(diǎn)級(jí)別,所在省市,熱度,地址分別做分析。并且記錄他們?cè)氐闹翟诤竺娼馕?HTML 的時(shí)候可以用到。

元素的 HTML 標(biāo)簽獲取類似上面兩個(gè)元素。把上面這些元素的 ID 或者 Class 可以先記錄下來(lái),在后面解析 HTML 的時(shí)候會(huì)用到。

爬蟲準(zhǔn)備

構(gòu)思和分析都完畢了,我們需要編寫代碼來(lái)實(shí)現(xiàn)想法。但是,在這之前我們需要把開發(fā)環(huán)境以及需要的工具準(zhǔn)備好。

由于涉及到網(wǎng)絡(luò)爬蟲,以及圖形的展示。所以這里計(jì)劃使用 Python 作為開發(fā)語(yǔ)言,IDE 環(huán)境使用 PyCharm,展示圖表用到 Pyecharts。

普及一下 Pyecharts,Echarts 是一個(gè)由百度開源的數(shù)據(jù)可視化,憑借著良好的交互性,精巧的圖表設(shè)計(jì),得到了眾多開發(fā)者的認(rèn)可。

而 Python 是一門富有表達(dá)力的語(yǔ)言,很適合用于數(shù)據(jù)處理。當(dāng)數(shù)據(jù)分析遇上數(shù)據(jù)可視化時(shí),Pyecharts 就誕生了。

因此,Pyecharts 可以理解為用 Python 來(lái)實(shí)現(xiàn)的 Echarts 程序,可以在 Python 上面運(yùn)行,并且提供良好的地理信息展示。

??

Pyecharts 圖標(biāo)

另外 Pyecharts 的地理展示功能比較強(qiáng)大,這點(diǎn)也是我們需要利用的。

??

Pyecharts 展示中國(guó)地圖

針對(duì) HTML 的解析我們使用了 BeautifulSoup。它是一個(gè)可以從 HTML 或 XML 文件中提取數(shù)據(jù)的 Python 庫(kù),它能夠通過(guò)你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式。

?[[278166]]?

BeautifulSoup 官網(wǎng)圖片

爬蟲編碼

萬(wàn)事具備只欠東風(fēng),讓我們開始寫代碼吧,為國(guó)慶搬磚讓我快樂(lè)。這里我們把程序分成兩個(gè)部分來(lái)寫,一部分是爬取旅游熱點(diǎn)信息,另一部分是旅游熱點(diǎn)地圖展示。

爬取旅游熱點(diǎn)信息

??

程序流水圖

先說(shuō)一下獲取旅游熱點(diǎn)信息的思路,大約分為四步:

  • 開始準(zhǔn)備必要的文件和引入組件包。
  • 組合變量 URL 并且做網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求不成功進(jìn)行重試。
  • 下載 HTML 以后對(duì)其進(jìn)行解析,找到旅游熱點(diǎn)列表,列表項(xiàng),分析具體旅游信息。
  • 把分析完的信息保存到 csv 文件中。

因?yàn)槲覀冃枰?qǐng)求網(wǎng)絡(luò),解析 HTML,保存文件,所以需要引入一些 Python 的包:

  • 網(wǎng)絡(luò)請(qǐng)求
  • HTML 解析
  • 讀寫 csv
  • 在請(qǐng)求頭中偽裝瀏覽器
  • 錯(cuò)誤重試,等待時(shí)間

??

接下來(lái)就是創(chuàng)建請(qǐng)求頭,請(qǐng)求頭中包括了請(qǐng)求的瀏覽器,語(yǔ)言,請(qǐng)求格式等信息。

這里我們是使用 fake_useragent 中 UserAgent 的 random 方法隨機(jī)產(chǎn)生瀏覽器的信息。

這樣在模擬瀏覽器訪問(wèn)網(wǎng)站的時(shí)候,每次請(qǐng)求都會(huì)隨機(jī)模擬一種瀏覽器。例如:IE,F(xiàn)irefox,Chrome 等等。讓網(wǎng)站認(rèn)為是不同的人,用不同的瀏覽器來(lái)訪問(wèn)網(wǎng)站的。

??

接下來(lái)生成一個(gè) csv 文件,用 utf-8 格式保存。這個(gè)文件是用來(lái)存放爬蟲信息。

在文件的表頭,我們分別定義了,“區(qū)域”,“名稱”等和景點(diǎn)相關(guān)的字段。在文件生成的時(shí)候就準(zhǔn)備好這些列,等填入數(shù)據(jù)以后,可以方便查看。

??

定義一個(gè)下載景點(diǎn)內(nèi)容的函數(shù),這個(gè)函數(shù)接受 URL 作為參數(shù),然后通過(guò) requests 對(duì)象下載景點(diǎn)內(nèi)容。

??

由于下載信息可能會(huì)遇到網(wǎng)絡(luò)問(wèn)題,導(dǎo)致下載失敗。所以,我們需要定義一個(gè)下載失敗函數(shù),在下載不成功的時(shí)候重試下載。

??

還記得之前分析的 URL 嗎?景點(diǎn)的類型和分頁(yè)是變量,這里我們定義一個(gè)生成 URL 的函數(shù)來(lái)處理這些變量。

我們會(huì)羅列需要搜索的景點(diǎn)類型在其中。Keyword 字段已經(jīng)轉(zhuǎn)換成 ACSII 碼了,如果需要直接輸入中文字符,可以使用 from urllib.parse import quote 來(lái)實(shí)現(xiàn)。

另外,我們的開始搜索的頁(yè)面,使用 page=1,之后會(huì)解析頁(yè)面中的“next”按鈕,完成翻頁(yè)的功能。

??

好了,到此我們定義了文件,下載函數(shù),重試下載函數(shù),分類搜集函數(shù),現(xiàn)在要定義最重要的 HTML 解析函數(shù)了。它的輸入?yún)?shù)是景點(diǎn)類型和 URL 地址。

依次執(zhí)行以下工作:

  • 下載 HTML,并且轉(zhuǎn)換成 SOUP 對(duì)象。
  • 找到旅游景點(diǎn)的列表。找到 div 的 id 為‘search-list’的元素。用 soup 的 find 方法找到它。
  • 針對(duì)景點(diǎn)的項(xiàng)目進(jìn)行遍歷。在‘search-list’元素下面,通過(guò) findAll 方法找到 class 是‘sight_item’的項(xiàng)目,并且對(duì)其進(jìn)行遍歷。
  • 解析具體景點(diǎn)信息:名稱,區(qū)域,省市,熱度,地址等等。
  • 找到翻頁(yè)按鈕,繼續(xù)往下載后面的頁(yè)面,并且再次解析。通過(guò) find 方法找到 class 是‘next’的 a 標(biāo)簽。

??

最后,執(zhí)行 main 函數(shù)運(yùn)行整個(gè) Python 程序:

??

??

下載完成的 csv 圖

csv 看上去比較凌亂,把文件通過(guò) xls 打開,看看格式化以后的熱點(diǎn)信息:

??

整理以后的旅游熱點(diǎn)圖

旅游熱點(diǎn)地圖展示

好了旅游熱點(diǎn)的信息已經(jīng)抓到了,現(xiàn)在開始分析。這里建議將抓取和分析工作分成兩塊來(lái)進(jìn)行。

因?yàn)?,在抓取過(guò)程中會(huì)遇到網(wǎng)絡(luò)問(wèn)題,解析問(wèn)題或者反爬蟲的問(wèn)題,而且抓取數(shù)據(jù)需要一段時(shí)間。

為了保證其獨(dú)立性,所以信息抓取可以單獨(dú)運(yùn)行。當(dāng)完成以后,把抓取的文件作為輸入放到展示程序中運(yùn)行。

展示程序主要完成,數(shù)據(jù)清洗,匯總求和以及展示地圖的工作。這樣前面的爬蟲和后面的分析展示就連成一體了。

??

旅游熱點(diǎn)分析流程圖

首先我們依舊要引入幾個(gè) Python 包,如下。其中 Geoopts 和 ChartType 都是用來(lái)展示地圖用的。

??

其次,我們需要裝載 csv 文件。雖然我們下載了很多信息,但是對(duì)于我們最重要的其實(shí)是省市和熱點(diǎn)信息。因?yàn)槲覀冏詈笳故境鰜?lái)的就是,哪個(gè)城市是旅游的熱點(diǎn)。

??

城市,熱度信息圖

根據(jù)觀察,要計(jì)算城市的熱度,必須將城市信息分組以后求和,這個(gè)也是需要考慮的。

??

根據(jù)城市信息對(duì)熱度求和

將一些地圖中無(wú)法識(shí)別的地點(diǎn),以及一些沒(méi)有熱度值的臟數(shù)據(jù)過(guò)濾掉,就可以將生成的城市,熱度列表傳給展示函數(shù)了。

??

最后,展示函數(shù)接受到列表參數(shù),繪制熱力圖:

??

結(jié)果分析

先看看哪些區(qū)域是大家比較喜歡的旅游目的地,如下圖:

??

2019 國(guó)慶旅游熱力圖

從圖上可以看出北京,沿海地區(qū)(福建,廣州),江浙地區(qū),甘肅地區(qū)是國(guó)慶期間比較熱門的景點(diǎn)。中部地區(qū)的武漢,由于軍運(yùn)會(huì)將至,也成為了旅游的熱門城市。

??

2019 國(guó)慶旅游熱點(diǎn)圖

再來(lái)看看,TOP 20 的旅游熱點(diǎn)城市,如下圖:

??

TOP 20 的 5A 旅游景點(diǎn):

??

總結(jié)

??

爬蟲思維導(dǎo)圖

在網(wǎng)絡(luò)爬蟲之前需要根據(jù)達(dá)到的目標(biāo)進(jìn)行構(gòu)思,包括:選擇網(wǎng)站,分析網(wǎng)站,數(shù)據(jù)抓取,數(shù)據(jù)展示。

在分析網(wǎng)站時(shí),需要注意以下幾點(diǎn),包括全局分析,URL 分析,元素分析。

在爬蟲編程之前,需要針對(duì)工具,IDE,Python 類庫(kù)進(jìn)行準(zhǔn)備。爬蟲編碼分為,爬取旅游熱點(diǎn)信息和旅游熱點(diǎn)地圖展示。

作者:崔皓

簡(jiǎn)介:十六年開發(fā)和架構(gòu)經(jīng)驗(yàn),曾擔(dān)任過(guò)惠普武漢交付中心技術(shù)專家,需求分析師,項(xiàng)目經(jīng)理,后在創(chuàng)業(yè)公司擔(dān)任技術(shù)/產(chǎn)品經(jīng)理。善于學(xué)習(xí),樂(lè)于分享。目前專注于技術(shù)架構(gòu)與研發(fā)管理。

??

【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO技術(shù)棧
相關(guān)推薦

2017-09-17 10:05:20

Python景點(diǎn)國(guó)慶

2019-10-08 15:08:28

人臉數(shù)據(jù)AI數(shù)據(jù)收集

2019-09-29 10:00:46

Python程序員旅游

2015-11-13 09:34:25

流量wifi運(yùn)營(yíng)商

2019-04-30 08:49:23

通信人才研發(fā)

2017-05-15 15:54:50

MySQL數(shù)據(jù)庫(kù)

2014-06-09 16:32:55

大數(shù)據(jù)大數(shù)據(jù)人才

2015-10-23 09:35:57

融資YC創(chuàng)始人投資

2018-11-06 13:24:27

爬蟲分析房租

2018-02-26 17:42:58

大數(shù)據(jù)一線城市北上廣深

2020-10-09 15:29:48

大數(shù)據(jù)國(guó)慶技術(shù)

2021-08-11 09:47:57

MySQL 數(shù)據(jù)InnoDB

2013-05-03 14:11:43

程序員

2024-01-25 17:58:14

OpenAIAI科技公司

2017-09-29 09:29:32

架構(gòu)技術(shù)棧微信半月刊

2017-10-31 16:06:51

大數(shù)據(jù)90后消費(fèi)

2021-04-27 09:33:41

Python北京景點(diǎn)

2020-01-09 13:24:31

Python 開發(fā)編程語(yǔ)言

2021-09-06 11:57:30

Python

2015-11-10 10:57:18

流量不清零運(yùn)營(yíng)商
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)