概述
- 前言
- 思考
- 統(tǒng)計(jì)結(jié)果
- 爬蟲技術(shù)分析
- 爬蟲代碼實(shí)現(xiàn)
- 爬蟲分析實(shí)現(xiàn)
- 后記
前言
舉國歡慶的國慶節(jié)馬上就要到來了,你想好去哪里看人山人海了嗎?還是窩在家里充電學(xué)習(xí)呢?說起國慶,塞車與爆滿這兩個(gè)詞必不可少荣堰,去年國慶我在想要是我能提前知道哪些景點(diǎn)爆滿就好了,就不用去湊熱鬧了竭翠。于是我開始折騰,想用 python 抓取有關(guān)出行方面的數(shù)據(jù)薇搁,便有了這篇文章斋扰。如果我的文章對你有幫助,歡迎關(guān)注啃洋、點(diǎn)贊传货、轉(zhuǎn)發(fā),這樣我會更有動(dòng)力做原創(chuàng)分享宏娄。
思考
(此段可跳過)要抓取出行方面的數(shù)據(jù)還不簡單问裕,直接去看看攜程旅游、馬蜂窩這類網(wǎng)站看看有沒有數(shù)據(jù)抓取孵坚。但是實(shí)際上這些網(wǎng)站并沒有比較好的格式化的數(shù)據(jù)供我們抓取粮宛,或許是我沒找到吧。我在想卖宠,有沒有什么折中的辦法巍杈。然而,就這樣半天過去了扛伍,突然想到筷畦,要出行肯定會查找相關(guān)的出行攻略吧,那么關(guān)鍵詞就是一個(gè)突破口刺洒,可以查詢百度指數(shù)來看看哪些景點(diǎn)被查詢的次數(shù)最多鳖宾,那么就可以大概知道哪些景點(diǎn)會爆滿了。
統(tǒng)計(jì)結(jié)果
此次的統(tǒng)計(jì)結(jié)果只是從側(cè)面反映景點(diǎn)爆滿的問題逆航,未必是完全準(zhǔn)確的鼎文,僅供參考。此次統(tǒng)計(jì)的景點(diǎn)共有 100 個(gè):
桂林纸泡、三亞漂问、泰山的搜索量都是杠杠的赖瞒,這第一梯隊(duì)的地方能不去就別去了,去了也是人山人海的蚤假,爆滿是無疑的了栏饮。
第二梯隊(duì)的搜索量也不差,日均搜索量還是上萬的磷仰,謹(jǐn)慎行動(dòng)袍嬉。
第三梯隊(duì)下來就可以考慮考慮,為了避免不必要的塞車與等待灶平,建議大家還是呆在家里吧K磐ā!逢享!
第四梯隊(duì)?wèi)?yīng)該沒太大的問題罐监,建議出去溜達(dá)溜達(dá)。
都到第五梯隊(duì)了瞒爬,就可以放心地玩耍了弓柱。經(jīng)歷了那么多的煩心事,是該好好放飛一下自己了侧但。
爬蟲技術(shù)分析
- 請求庫:selenium
- HTML 解析:使用正則匹配
- 數(shù)據(jù)可視化:pyecharts
- 數(shù)據(jù)庫:MongoDB
- 數(shù)據(jù)庫連接:pymongo
爬蟲分析實(shí)現(xiàn)
此次文章能夠?qū)崿F(xiàn)參考效果矢空,完全是因?yàn)槎稒C(jī)靈。首先是選取爬蟲來源禀横,攜程與馬蜂窩沒有結(jié)構(gòu)化的數(shù)據(jù)屁药,我們就換一種思路。首先是想到百度指數(shù)柏锄,如圖:
但是酿箭,分析源代碼之后,你就會發(fā)現(xiàn)坑爹之處了绢彤,它的數(shù)據(jù)都是以圖片展示的七问,你不能直接獲取到源碼,考慮到國慶馬上就要到來茫舶,我換了一個(gè)指數(shù)平臺械巡,轉(zhuǎn)戰(zhàn)搜狗指數(shù),這個(gè)平臺可以直接獲取到源數(shù)據(jù)饶氏,關(guān)鍵是讥耗,還有微信熱度可以爬取。當(dāng)然疹启,你執(zhí)意要使用百度指數(shù)古程,這里也是有方法的,抓取到數(shù)據(jù)之后喊崖,使用圖像識別來識別文中的數(shù)據(jù)挣磨,提供一個(gè)鏈接爬蟲實(shí)戰(zhàn)——四大指數(shù)之百度指數(shù)(三)
關(guān)于數(shù)據(jù)清洗方面雇逞,這里篩選了數(shù)據(jù)量過小,和數(shù)據(jù)量異常大的景點(diǎn)茁裙,詳情在源碼中查看塘砸。
# 這是數(shù)據(jù)展示的代碼片段
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("各景點(diǎn) 30 天內(nèi)平均搜索量", atts, values)
os.rename("render.html", file_name)
爬蟲代碼實(shí)現(xiàn)
# 這是數(shù)據(jù)爬取的代碼片段
def get_index_data(self):
try:
for url in self.get_url():
print("當(dāng)前地址為:" + 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")
后記
整篇爬蟲文章分析到這里就結(jié)束晤锥,不過還是對百度指數(shù)很有執(zhí)念掉蔬,想找個(gè)時(shí)間寫一篇相關(guān)的文章才行,不搞定它感覺心里有塊疙瘩矾瘾,或許這就是程序員最后的倔強(qiáng)女轿,最后祝大家國慶假期愉快,不用寫代碼壕翩。
本篇文章首發(fā)于公眾號「zone7」蛉迹,關(guān)注公眾號獲取最新推文,后臺回復(fù)【國慶指數(shù)】獲取源碼放妈。