1. 程式人生 > >100 行 python 程式碼告訴你國慶哪些景點爆滿

100 行 python 程式碼告訴你國慶哪些景點爆滿

前言

舉國歡慶的國慶節馬上就要到來了,你想好去哪裡看人山人海了嗎?還是窩在家裡充電學習呢?說起國慶,塞車與爆滿這兩個詞必不可少,去年國慶我在想要是我能提前知道哪些景點爆滿就好了,就不用去湊熱鬧了。於是我開始折騰,想用 python 抓取有關出行方面的資料,便有了這篇文章。如果我的文章對你有幫助,歡迎關注、點贊、轉發,這樣我會更有動力做原創分享。

我們都知道Python容易學,但是就是不知道如何去學,去哪裡找資料,在這裡呢,python學習交流qq群233539995,分享我精心準備的Python學習資料,0基礎到進階!希望你們在學習Python道路上少走彎路!加油!

弘揚一下社會主義核心價值觀

思考

(此段可跳過)要抓取出行方面的資料還不簡單,直接去看看攜程旅遊、馬蜂窩這類網站看看有沒有資料抓取。但是實際上這些網站並沒有比較好的格式化的資料供我們抓取,或許是我沒找到吧。我在想,有沒有什麼折中的辦法。然而,就這樣半天過去了,突然想到,要出行肯定會查詢相關的出行攻略吧,那麼關鍵詞就是一個突破口,可以查詢百度指數來看看哪些景點被查詢的次數最多,那麼就可以大概知道哪些景點會爆滿了。

統計結果

此次的統計結果只是從側面反映景點爆滿的問題,未必是完全準確的,僅供參考。此次統計的景點共有 100 個:

桂林、三亞、泰山的搜尋量都是槓槓的,這第一梯隊的地方能不去就別去了,去了也是人山人海的,爆滿是無疑的了。

捂臉.jpg

top0-10

第二梯隊的搜尋量也不差,日均搜尋量還是上萬的,謹慎行動。

top10-20

第三梯隊下來就可以考慮考慮,為了避免不必要的塞車與等待,建議大家還是呆在家裡吧!!!

top20-30

第四梯隊應該沒太大的問題,建議出去溜達溜達。

top30-40

都到第五梯隊了,就可以放心地玩耍了。經歷了那麼多的煩心事,是該好好放飛一下自己了。

top40-50

爬蟲技術分析

請求庫:selenium

HTML 解析:使用正則匹配

資料視覺化:pyecharts

資料庫:MongoDB

資料庫連線:pymongo

爬蟲分析實現

此次文章能夠實現參考效果,完全是因為抖機靈。首先是選取爬蟲來源,攜程與馬蜂窩沒有結構化的資料,我們就換一種思路。首先是想到百度指數,如圖:

百度指數

但是,分析原始碼之後,你就會發現坑爹之處了,它的資料都是以圖片展示的,你不能直接獲取到原始碼,考慮到國慶馬上就要到來,我換了一個指數平臺,轉戰搜狗指數,這個平臺可以直接獲取到源資料,關鍵是,還有微信熱度可以爬取。當然,你執意要使用百度指數,這裡也是有方法的,抓取到資料之後,使用影象識別來識別文中的資料,提供一篇有思路的文章 [爬蟲實戰——四大指數之百度指數(三) 連結:https://zhuanlan.zhihu.com/p/28973232]。

關於資料清洗方面,這裡篩選了資料量過小,和資料量異常大的景點,詳情在原始碼中檢視。

搜狗指數

資料展示的程式碼片段

def show_data(self):

forindexin range(5):

queryArgs = {"day_avg_pv": {"$lt":100000}}

rets = self.zfdb.national_month_index.find(queryArgs).sort("day_avg_pv", pymongo.DESCENDING).limit(10).skip(index*10)

atts = []

values= []

file_name ="top"+ str(index*10) +"-"+ str((index+1) *10) +".html"

forret in rets:

print(ret)

atts.append(ret["address"])

values.append(ret["day_avg_pv"])

self.show_line("各景點 30 天內平均搜尋量", atts,values)

os.rename("render.html", file_name)

爬蟲程式碼實現

由於篇幅原因,這就只展示主要程式碼,詳情請檢視原始碼,可以檢視GitHub地址:https://github.com/zonezoen/nationalDayIndex

# 這是資料爬取的程式碼片段

defget_index_data(self):

try:

forurlinself.get_url():

print("當前地址為:"+ url)

self.browser.get(url)

self.browser.implicitly_wait(10)

ret = re.findall(r'root.SG.data = (.*)}]};', self.browser.page_source)

totalJson = json.loads(ret[0] +"}]}")

topPvDataList = totalJson["topPvDataList"]

infoList = totalJson["infoList"]

pvList = totalJson["pvList"]

forindex, infoinenumerate(infoList):

forpvDateinpvList[index]:

print("index => "+str(index)+"地址 => "+info["kwdName"] +"日期 => "+ str(pvDate["date"]) +" => "+ str(pvDate["pv"]) +" => "+ str(

info["avgWapPv"]) +" => "+ str(info["kwdSumPv"]["sumPv"]) +" => ")

self.zfdb.national_day_index.insert({

"address": info["kwdName"],# 地名

"date": pvDate["date"],# 日期

"day_pv": pvDate["pv"],# 日訪問量

})

self.zfdb.national_month_index.insert({

"address": info["kwdName"],# 地名

"day_avg_pv": info["avgWapPv"],# 平均訪問量

"sum_pv": info["kwdSumPv"]["sumPv"],# 總訪問量

})

except:

print("exception")

後記

整篇爬蟲文章分析到這裡就結束,不過還是對百度指數很有執念,想找個時間寫一篇相關的文章才行,不搞定它感覺心裡有塊疙瘩,或許這就是程式設計師最後的倔強,最後祝大家國慶假期愉快,不用寫程式碼。

我們都知道Python容易學,但是就是不知道如何去學,去哪裡找資料,在這裡呢,python學習交流qq群233539995,分享我精心準備的Python學習資料,0基礎到進階!希望你們在學習Python道路上少走彎路!加油!

小禮物走一走,來簡書關注我