本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理
2020 註定是不平凡的一年,一開年就被新冠疫情來了當頭一棒,一瞬間大家都不約而同的採取家裡蹲策略,在政府的得力領導下,全部人民上下一條心,到了四五月份終於將疫情穩定控制住了,時隔半年,國內疫情早已趨於穩定,人們的生活也基本恢復正常。
恰逢國慶中秋兩個節日重合,在家憋這麼久的人們怎麼能不出去看看祖國的大好河山。據新華網消息,整個國慶長假外出遊玩人次達 6.37 億人次,那麼這麼多人都到哪兒去玩了呢,今天我們就用 Python 做一個全國熱門景區熱點圖。
我們的思路是,在中國地圖上標註出熱門景點,通過該熱點圖我們可以一眼看出哪些城市和地區最熱門,也就意味著那個地區人是最多的。
那麼我們就必須獲取到全國的旅遊數據,最簡單的思路就是從第三方旅遊網站看下哪些景點的門票賣的最多最好,而最常用的網站就是飛豬、攜程、去哪兒等。
有了數據來源之後就要想辦法將網站的數據通過爬蟲的方式爬取下來,之後再對爬取到的數據做清洗、過濾、整理。最後就將格式匹配的數據直接在地圖上展示出來即可。
經過對比幾個第三方旅遊網站,發現去哪兒網有一個「熱門景點」的內頁,在首頁輸入框直接輸入「熱門景點」即可直達該頁面。該網站還將這些熱門景點進行了分類,比如人文景觀,城市風貌,古建築等。同時我們需要的景點名稱,城市,景區級別以及景區地址等信息都可以從該頁面獲取得到。
打開去哪兒網,首頁輸入「熱門景點」仔細觀察頁面最上方的 URL 你會發現驚喜。其中 subject 就是景點主題,而 page 看樣子則是頁碼,點擊下一頁驗證一下,page 變成 2 了,沒猜錯。
不需要太多的數據,因此我們在每一個主題下面只取前十頁的數據就可以了。
分析完 URL 之後,再來看看數據從什麼地方獲取的,切換到瀏覽器開發者模式,瀏覽下我們發現所有的景點數據都在一個叫做 」search-list「 的 div 中。針對單個景點,其數據是在一個 class = 『sight_item』 的 div 中。接下來就是解析頁面原屬,將景點,省市,時間,熱度等數據做分析。
數據源頭已經分析完畢,接下來就可以開始我們的爬蟲編碼了,首先定義好我們的準備獲取全國景點的主題。為了方便後續操作,我們可以將解析好的數據保存到 csv 文件中。
subjects = ['文化古蹟', '自然風光', '農家度假', '遊樂場', '展館', '古建築', '城市觀光']excel_file = open('data.csv', 'w', encoding='utf-8', newline='')writer = csv.writer(excel_file)writer.writerow(['名稱', '城市', '類型', '級別', '熱度', '地址'])
其次我們需要一個下載網頁內容的函數,該函數接受一個 URL 參數,之後返回該 URL 對應的網頁內容,同時為了更真實的模擬瀏覽器請求,需要添加 Headers。
headers = { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 'referer': 'https://piao.qunar.com/', 'cookie': 'xxxyyyzzz...'}def get_page_html(url): try: response = requests.get(url, headers=headers) if response.status_code == 200: return response.text return None except RequestException: return None
獲取到內容之後,我們還需要一個解析函數,該函數接收一個網頁文本,然後將我們所需要的「名稱, 城市, 類型, 級別, 熱度, 地址」信息解析出來,並寫入 csv 文件。
def parse_content(content, subject): if not content: return; soup = BeautifulSoup(content, "html.parser") search_list = soup.find(id='search-list') items = search_list.find_all('div', class_="sight_item") for item in items: name = item['data-sight-name'] districts = item['data-districts'] address = item['data-address'] level = item.find('span', class_='level') level = level.text if level else '' star = item.find('span', class_='product_star_level') star = star.text if star else '' writer.writerow([name, districts, subject, level, star, address])
至此我們已經準備好,下載函數,解析函數,現在只需要直接遍歷主題,拼接 URL 調用相關函數即可。為了防止被禁封 IP,每次請求之後讓程序暫停 5 秒。
def get_data(): for subject in subjects: for page in range(10): page = page + 1 url = F'https://piao.qunar.com/ticket/list.htm?keyword=熱門景點®ion=&from=mps_search_suggest&subject={subject}&page={page}&sku=' print(url) content = get_page_html(url) parse_content(content, subject, url) time.sleep(5)if __name__ == '__main__': get_data()
最後執行 main 入口函數來運行程序,來看看我們搜集到的數據。
獲取到全國的旅遊數據之後,就可以開始分析了。為了讓操作方便,引入 pandas,先仔細看下我們的數據格式。首先熱度一列裡面含有中文,需要分割,其次因為熱度數值是小數不方便操作,因此我們決定將熱度擴大 1000 倍,因為是整體擴大了 1000 倍,因此並不會影響分析結果。
之後我們需要解析出該景點所在的城市。同樣是分割字符串。同時因為還有一些地點是地圖無法識別的,所以要去除。
data = []with open('data.csv', 'r') as f: reader = csv.reader(f) header = next(reader) for row in reader: data.append(row)df_data = []for row in data: city = row[1].split('·')[1] if city in ['保亭', '德宏', '湘西', '陵水', '黔東南', '黔南']: continue star = row[4].split('熱度')[1].strip() star = int(float(star) * 1000) df_data.append([row[0], city, row[3], star])df = pd.DataFrame(df_data, columns=['name', 'city', 'level', 'star'])
數據準備妥當,繪製熱點圖。
data = df.groupby(by=['city'])['star'].sum()citys = list(data.index)city_stars = list(data)data = [list(z) for z in zip(citys, city_stars)]geo = ( Geo() .add_schema(maptype="china") .add( "熱點圖", #圖題 data, type_=ChartType.HEATMAP, #地圖類型 ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) #設置是否顯示標籤 .set_global_opts( visualmap_opts=opts.VisualMapOpts(max_ = 5000), #設置legend顯示的最大值 title_opts=opts.TitleOpts(title=""), #左上角標題 ))geo.render_notebook()
從上圖可以看出,東南沿海,北京周邊以及雲南四川是比較熱門的地區。
再來看看 TOP 15 的熱點旅遊城市:
再來看看 TOP 10 的熱點旅遊景區:
今天我們對去哪兒的國慶熱門景點進行了抓取和分析,一整套流程下來還是涉及到不少東西。包括網站分析,數據抓取和清洗以及圖標展示。尤其是網頁元素分析,需要多點耐心。
分析結果也比較符合預期,風景建築類地點比較多人想去,畢竟大城市的人天天待格子間,趁著長假多去戶外呼吸呼吸新鮮空氣,其次北京、上海、杭州、成都等大都市依然很受歡迎。
因為疫情,國慶節可以說是 2020 的第一個旅遊黃金周了,就在國外還在為疫情苦苦發愁的時刻,我們的客運航運已經恢復的差不多了,同時為了刺激消費,各個地方政府接連發放各種優惠券,外出遊玩的小夥伴們也算是奉旨出遊,為我國經濟增長貢獻了自己的力量。
那麼這個國慶節,你去哪浪了呢?
最後,小編想說:我是一名python開發工程師,整理了一套最新的python系統學習教程,
想要這些資料的可以關注私信小編「01」即可,希望能對你有所幫助.。