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道路上少走彎路!加油!
小禮物走一走,來簡書關注我