用Python偷偷告訴你國慶8億人都去哪兒浪?
原創【51CTO.com原創稿件】祖國 70 周年的華誕一天天臨近,各行各業都在為祖國母親慶祝生日。作為一個 IT 人,也想貢獻一份綿薄之力。
圖片來自 Pexels
據文化和旅游部消息稱,預計 2019 年國慶旅游人次有望達到近 8 億。
#國慶假期或有近 8 億人次出游#這個話題還沖上了微博熱搜榜。
我仿佛已經看到了假期景區人山人海的畫面!
??
左思右想,最后落腳到國慶長假的旅游上,能否用網絡爬蟲看看,十一長假哪些城市最堵?哪些景區最熱門?
今天一起來看看,如何利用網絡爬蟲生成國慶期間的旅游熱點圖吧。
需求構思
制作一張旅游熱點圖,我們想要達到的效果是,在一張中國地圖上面標注出旅游熱點。
通過這張圖可以知道哪些城市,或者哪些區域是十一期間的旅游熱點。也就是說哪些地方在國慶期間去玩的人多。
構思圖
首先,我們要找一個數據源能夠獲取全國旅游信息。這里有一個思路就是訂票信息,哪些景點的訂票比較多,那么這些景點所在的城市就越熱門。類似的售票網站比較多,例如:攜程,去哪兒,途牛旅游之類的。
然后,需要分析網站上面的票務數據,將我們感興趣的旅游熱點信息爬取下來。分析信息的重點是針對網頁 HTML 信息的解析。
之后,將分析完畢的信息按照一定格式保存到本地,由于下載的信息可能和最終展示信息存在偏差,所以需要做一些數據清洗和數據聚合的操作。
最后,將整理好的信息輸入到地圖上顯示出來,這也是最后展示的環節。這里可以選擇對外展示的方式,例如:點圖,線圖,或者熱力圖。
網站分析
全局預覽
找了一圈旅游網站以后,發現在“去哪兒”的門票頁面中,有一個對旅游景點熱度的展示信息。
網頁會根據不同類型景點(自然風光,文化古跡等)進行查詢,查詢的結果會顯示景點名稱,景點熱度和城市信息。
如果我們將這些景點對應的區域的熱度進行匯總,就可以知道哪些區域對應的景點熱度了。
先打開去哪兒旅游,搜索“熱門景點”。下面列出了各個地方的熱門旅游景點。
針對景點主題做了分類,在展示的列表中,有景點名稱,景點級別,所在省市,以及熱度。其中省市和熱點是我們關心的數據。
URL 分析
URL 分析圖
打開 Chrome 的開發者工具來看看 HTML 頁面的結構。URL 的規律很容易能夠看明白:
- Keyword 就是“熱門景點”,它是個常量,每次請求填寫這個就行了。
- Subject 是景點分類,例如:自然風光,游樂場,文化古跡等等。這個需要一一羅列出來,是在一個變量后面用數組存放。
- Page 是頁數,如果我們要爬取所有的信息,需要一頁一頁往下翻,所以這個數字會不斷增長。頁面滑動到最下方的時候,會看到 Next 按鈕,可以通過這個按鈕將所有頁面都遍歷到。
URL 全景圖
頁面元素分析
通過 Chrome 開發者工具中的元素選擇器,可以清楚地看到元素的 HTML 標簽。
列表元素圖
由于景點信息放在一個列表中,所以找到列表所在的元素,它放在 id 為“search-list”的 div 中。
也就是說在請求 URL 并獲取 HTML 之后,我就需要找到“search-list”div 并且獲取其中對應的項目信息。
獲取了列表元素之后,再來看看每一項旅游紀錄中的值如何獲取。其內容放在”sight_item”的 div 中。
列表中每項的示意圖
接下來分別將景點名稱,景點級別,所在省市,熱度,地址分別做分析。并且記錄他們元素的值在后面解析 HTML 的時候可以用到。
元素的 HTML 標簽獲取類似上面兩個元素。把上面這些元素的 ID 或者 Class 可以先記錄下來,在后面解析 HTML 的時候會用到。
爬蟲準備
構思和分析都完畢了,我們需要編寫代碼來實現想法。但是,在這之前我們需要把開發環境以及需要的工具準備好。
由于涉及到網絡爬蟲,以及圖形的展示。所以這里計劃使用 Python 作為開發語言,IDE 環境使用 PyCharm,展示圖表用到 Pyecharts。
普及一下 Pyecharts,Echarts 是一個由百度開源的數據可視化,憑借著良好的交互性,精巧的圖表設計,得到了眾多開發者的認可。
而 Python 是一門富有表達力的語言,很適合用于數據處理。當數據分析遇上數據可視化時,Pyecharts 就誕生了。
因此,Pyecharts 可以理解為用 Python 來實現的 Echarts 程序,可以在 Python 上面運行,并且提供良好的地理信息展示。
Pyecharts 圖標
另外 Pyecharts 的地理展示功能比較強大,這點也是我們需要利用的。
Pyecharts 展示中國地圖
針對 HTML 的解析我們使用了 BeautifulSoup。它是一個可以從 HTML 或 XML 文件中提取數據的 Python 庫,它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式。
BeautifulSoup 官網圖片
爬蟲編碼
萬事具備只欠東風,讓我們開始寫代碼吧,為國慶搬磚讓我快樂。這里我們把程序分成兩個部分來寫,一部分是爬取旅游熱點信息,另一部分是旅游熱點地圖展示。
爬取旅游熱點信息
程序流水圖
先說一下獲取旅游熱點信息的思路,大約分為四步:
- 開始準備必要的文件和引入組件包。
- 組合變量 URL 并且做網絡請求,請求不成功進行重試。
- 下載 HTML 以后對其進行解析,找到旅游熱點列表,列表項,分析具體旅游信息。
- 把分析完的信息保存到 csv 文件中。
因為我們需要請求網絡,解析 HTML,保存文件,所以需要引入一些 Python 的包:
- 網絡請求
- HTML 解析
- 讀寫 csv
- 在請求頭中偽裝瀏覽器
- 錯誤重試,等待時間
接下來就是創建請求頭,請求頭中包括了請求的瀏覽器,語言,請求格式等信息。
這里我們是使用 fake_useragent 中 UserAgent 的 random 方法隨機產生瀏覽器的信息。
這樣在模擬瀏覽器訪問網站的時候,每次請求都會隨機模擬一種瀏覽器。例如:IE,Firefox,Chrome 等等。讓網站認為是不同的人,用不同的瀏覽器來訪問網站的。
接下來生成一個 csv 文件,用 utf-8 格式保存。這個文件是用來存放爬蟲信息。
在文件的表頭,我們分別定義了,“區域”,“名稱”等和景點相關的字段。在文件生成的時候就準備好這些列,等填入數據以后,可以方便查看。
定義一個下載景點內容的函數,這個函數接受 URL 作為參數,然后通過 requests 對象下載景點內容。
由于下載信息可能會遇到網絡問題,導致下載失敗。所以,我們需要定義一個下載失敗函數,在下載不成功的時候重試下載。
還記得之前分析的 URL 嗎?景點的類型和分頁是變量,這里我們定義一個生成 URL 的函數來處理這些變量。
我們會羅列需要搜索的景點類型在其中。Keyword 字段已經轉換成 ACSII 碼了,如果需要直接輸入中文字符,可以使用 from urllib.parse import quote 來實現。
另外,我們的開始搜索的頁面,使用 page=1,之后會解析頁面中的“next”按鈕,完成翻頁的功能。
好了,到此我們定義了文件,下載函數,重試下載函數,分類搜集函數,現在要定義最重要的 HTML 解析函數了。它的輸入參數是景點類型和 URL 地址。
依次執行以下工作:
- 下載 HTML,并且轉換成 SOUP 對象。
- 找到旅游景點的列表。找到 div 的 id 為‘search-list’的元素。用 soup 的 find 方法找到它。
- 針對景點的項目進行遍歷。在‘search-list’元素下面,通過 findAll 方法找到 class 是‘sight_item’的項目,并且對其進行遍歷。
- 解析具體景點信息:名稱,區域,省市,熱度,地址等等。
- 找到翻頁按鈕,繼續往下載后面的頁面,并且再次解析。通過 find 方法找到 class 是‘next’的 a 標簽。
最后,執行 main 函數運行整個 Python 程序:
下載完成的 csv 圖
csv 看上去比較凌亂,把文件通過 xls 打開,看看格式化以后的熱點信息:
整理以后的旅游熱點圖
旅游熱點地圖展示
好了旅游熱點的信息已經抓到了,現在開始分析。這里建議將抓取和分析工作分成兩塊來進行。
因為,在抓取過程中會遇到網絡問題,解析問題或者反爬蟲的問題,而且抓取數據需要一段時間。
為了保證其獨立性,所以信息抓取可以單獨運行。當完成以后,把抓取的文件作為輸入放到展示程序中運行。
展示程序主要完成,數據清洗,匯總求和以及展示地圖的工作。這樣前面的爬蟲和后面的分析展示就連成一體了。
旅游熱點分析流程圖
首先我們依舊要引入幾個 Python 包,如下。其中 Geoopts 和 ChartType 都是用來展示地圖用的。
其次,我們需要裝載 csv 文件。雖然我們下載了很多信息,但是對于我們最重要的其實是省市和熱點信息。因為我們最后展示出來的就是,哪個城市是旅游的熱點。
城市,熱度信息圖
根據觀察,要計算城市的熱度,必須將城市信息分組以后求和,這個也是需要考慮的。
根據城市信息對熱度求和
將一些地圖中無法識別的地點,以及一些沒有熱度值的臟數據過濾掉,就可以將生成的城市,熱度列表傳給展示函數了。
最后,展示函數接受到列表參數,繪制熱力圖:
結果分析
先看看哪些區域是大家比較喜歡的旅游目的地,如下圖:
2019 國慶旅游熱力圖
從圖上可以看出北京,沿海地區(福建,廣州),江浙地區,甘肅地區是國慶期間比較熱門的景點。中部地區的武漢,由于軍運會將至,也成為了旅游的熱門城市。
2019 國慶旅游熱點圖
再來看看,TOP 20 的旅游熱點城市,如下圖:
TOP 20 的 5A 旅游景點:
總結
爬蟲思維導圖
在網絡爬蟲之前需要根據達到的目標進行構思,包括:選擇網站,分析網站,數據抓取,數據展示。
在分析網站時,需要注意以下幾點,包括全局分析,URL 分析,元素分析。
在爬蟲編程之前,需要針對工具,IDE,Python 類庫進行準備。爬蟲編碼分為,爬取旅游熱點信息和旅游熱點地圖展示。
作者:崔皓
簡介:十六年開發和架構經驗,曾擔任過惠普武漢交付中心技術專家,需求分析師,項目經理,后在創業公司擔任技術/產品經理。善于學習,樂于分享。目前專注于技術架構與研發管理。
【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】