­

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

  • 2019 年 11 月 12 日
  • 筆記

前言

舉國歡慶的國慶節馬上就要到來了,你想好去哪裡看人山人海了嗎?還是窩在家裡充電學習呢?說起國慶,塞車與爆滿這兩個詞必不可少,去年國慶我在想要是我能提前知道哪些景點爆滿就好了,就不用去湊熱鬧了。於是我開始折騰,想用 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):      for index in 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"          for ret 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

# 這是數據爬取的程式碼片段  def get_index_data(self):      try:          for url in self.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"]              for index, info in enumerate(infoList):                  for pvDate in pvList[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")

後記

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