
“你喜歡旅游嗎?”
這個簡單的問題經(jīng)常會得到一個積極的回復甚至還會額外收到一個或兩個冒險的故事。通常來講,旅行是一種體驗新文化和拓寬自己視野的好方法。
但如果把問題換成“你喜歡查機票的過程嗎?”,我敢肯定大家的反應一定會不那么熱情......
那么,用Python解決你的難點吧!本文作者Fábio Neves,一位資深的商業(yè)數(shù)據(jù)分析師將會帶你建立一個網(wǎng)絡爬蟲項目,幫助我們找到最優(yōu)惠的價格!
具體做法是對特定目的地以及靈活的日期范圍(根據(jù)你選擇的日期前后最多3天)進行航班價格搜索。
搜索結(jié)果保存到一個excel中并為你發(fā)送一封展示快速統(tǒng)計信息的電子郵件。顯然,最終的目的是幫助我們找到最優(yōu)惠的價格!
如果你真的想試試,你可以在服務器上執(zhí)行這個腳本(一個簡單的Raspberry Pi就可以(注:Raspberry Pi樹莓派又稱卡片式電腦,外形只有信用卡大小,運算性能和智能手機相仿。So大家在自己筆記本電腦上折騰就足夠了。。)),并且每天運行一次或兩次。它會將檢索結(jié)果以郵件的形式發(fā)給你,我建議將excel文件保存到Dropbox云端,這樣你就可以隨時隨地訪問它。
注:Dropbox是一個類似于百度云的云端服務
我還是沒找到任何錯誤低價票,但我想還是有可能的!
它會根據(jù)“彈性日期范圍”進行檢索,以便查找你首選日期的前后最多3天的所有航班。盡管該腳本一次只適用于一組from/to目的地,但你可以輕松地調(diào)整它在每個循環(huán)內(nèi)運行多組行程目的地。你甚至可能最終找到一些錯誤低價票......簡直棒極了!
爬蟲腳本
當我第一次開始做網(wǎng)絡爬蟲時,我對這塊并不特別感興趣。我本想用預測建模,財務分析和一些情緒分析來做更多的項目,但事實證明,弄明白如何構建第一個網(wǎng)絡爬蟲是很有趣的。隨著我不斷學習,我意識到網(wǎng)絡抓取是互聯(lián)網(wǎng)運轉(zhuǎn)的精髓。
是的......就像Larry 和 Sergey一樣,在啟動爬蟲程序后去盡情享受按摩浴缸吧!
你可能認為這是一個非常大膽的想法,但如果我告訴你谷歌就誕生于Larry 和 Sergey通過Java和Python寫的爬蟲程序呢?谷歌通過爬取整個互聯(lián)網(wǎng)來試圖為你的問題提供最佳答案。有非常多關于網(wǎng)絡爬蟲的應用程序,即便你更喜歡數(shù)據(jù)科學中的其他主題,你仍然需要一些爬蟲技能來獲取想要的數(shù)據(jù)。
Python可以來拯救你
第一個挑戰(zhàn)是選擇從哪個平臺抓取信息。這其實并不容易,但我最終選擇了Kayak。決定之前我嘗試了Momondo,Skyscanner,Expedia等等,但這些網(wǎng)站上的驗證碼部分真的是讓人抓狂。經(jīng)過幾次嘗試選擇交通信號燈,人行橫道和自行車的這種“你是真人嗎”的檢查后,我的結(jié)論是Kayak是目前最好的選擇,即使它在短時間內(nèi)加載太多頁面時也會拋出安全性校驗。
我設置機器人以4到6小時的間隔來查詢網(wǎng)站,這樣就不會有問題了。在這里和那里偶爾可能會出現(xiàn)卡殼中斷現(xiàn)象,但是如果你遇到驗證碼校驗,那么你需要手動進行驗證碼認證,確認完畢后再啟動機器人程序,然后等待幾個小時它就會重置。你也可以隨意將這些代碼應用到其他平臺,歡迎你在評論部分分享你的應用!
如果你是個爬蟲新手,或者還不了解為什么有一些網(wǎng)站總會設置各種障礙來阻止網(wǎng)絡抓取,那么在寫第一行爬蟲代碼之前,請你先閱讀了解一下谷歌“ 網(wǎng)絡抓取禮儀 ”。如果你像瘋子一樣準備好了開始網(wǎng)絡抓取,你獲得努力成果可能會比你想象的要快得多。
網(wǎng)絡抓取禮儀 :
http://lmgtfy.com/?q=web+scraping+etiquette
請系好安全帶……
打開chrome標簽頁后,我們將定義一些在循環(huán)內(nèi)使用的函數(shù)。關于整體結(jié)構的大致想法是這樣的:
OK,每個Selenium項目都將以webdriver作為開頭。我用的是ChromeDriver,當然還有其他選擇。比如,PhantomJS或Firefox也很受歡迎。webdriver下載好之后,將其放在一個文件夾中就可以了。代碼的第一行將會自動打開一個空白的Chrome標簽頁。
請注意,我不是在這里開辟新天地,或是提出一種非常具有開拓性的創(chuàng)新。當下確實已經(jīng)有更先進的方法來尋找便宜的票價,但我希望我的這個帖子可以跟大家分享一些簡單而實用的東西!
這些是我用于整個項目所引用的包。我將使用randint來讓機器人在每次搜索之間隨機停頓幾秒鐘。這是所有機器人所必備的功能。如果你運行了前面的代碼,則需要先打開一個Chrome網(wǎng)頁窗口作為機器人檢索的入口。
所以,先讓我們來快速測試一下,在新網(wǎng)頁打開http://kayak.com。選擇你要飛往的城市和日期。選擇日期時,請務必選擇“+ -3天”。我已經(jīng)編寫了相關的代碼,如果你只想搜索特定日期,那么你需要適當?shù)剡M行一些調(diào)整。我將盡量在整個文本中指出所有的變動值。
點擊搜索按鈕并獲取地址欄中的鏈接。這個鏈接應該就是我在下面需要用的鏈接,在這里我將變量kayak定義為url并調(diào)用webdriver的get方法。你的搜索結(jié)果接下來應該就會出現(xiàn)了。
每當短時間內(nèi)多次使用get命令的時候,系統(tǒng)就會跳出驗證碼檢查。你可以手動解決驗證碼問題,并在下一個問題出現(xiàn)之前繼續(xù)測試腳本。從我的測試來看,第一次搜索運行似乎一切正常,所以如果你想要用這段代碼,并且讓它們之間保持較長的執(zhí)行間隔,就可以解決掉這個難題。你并不需要每10分鐘就更新這些價格,不是嗎?!
XPath的坑
目前為止,我們打開了一個瀏覽器窗口并獲得了網(wǎng)址。接下來我會使用XPath或者CSS選擇器來抓取價格等其他信息。曾經(jīng)我也只用XPath,當時我覺得沒必要用CSS,但是現(xiàn)在看來最好結(jié)合著用。你可以直接用瀏覽器復制網(wǎng)頁XPath來用,你也會發(fā)現(xiàn)由XPath雖可以定位網(wǎng)頁元素但是可讀性很差,所以我漸漸意識到只用XPath很難獲得你想要的頁面元素。有時候,指向得越細就越不好用。
接下來,我們用Python來選擇出最低票價的頁面元素。上述代碼中紅色部分就是XPath選擇器的代碼,在網(wǎng)頁中,你可以在任意位置點擊右鍵并選擇“檢查”來找到它。試試吧,在你想看代碼的地方點右鍵,“檢查”它。
為了說明我前面所說的XPath的不足,請大家對比如下差異:
1 # This is what the copy method would return. Right click highlighted rows on the right side and select "copy > Copy XPath"http://*[@id="wtKI-price_aTab"]/div[1]/div/div/div[1]/div/span/span2 # This is what I used to define the "Cheapest" buttoncheap_results = ‘//a[@data-code = “price”]’
上述代碼中,第二種方式的簡潔性清晰可見。它會去搜素具有data-code屬性值為price的a元素。而第一種方式則是去搜素一個id為wtKI-price_aTab元素,且該元素嵌在5層div及2層span內(nèi)。對于這次頁面,它能起作用,但這里的坑在于,下次加載頁面時,這個id會變,而且每次加載時wtKI值也是動態(tài)變化的,所以到時候這段代碼就無效了。所以多花點功夫研究一下XPath表示的內(nèi)容還是對你有價值的。
不過這種直接復制XPath的方法對于那些不是很復雜善變的頁面來說還是蠻好用的。
基于上述代碼結(jié)果,如果我想找出所有匹配的結(jié)果并存到list里,該怎么做呢?很簡單,因為所有結(jié)果都在CSS對象resultWrapper中,只要按照我下圖代碼中寫個for循環(huán)就能獲得所有結(jié)果。這個思路掌握了,那下圖的代碼你也就基本看明白了。也就是說,先選定最外層的頁面元素(如本文網(wǎng)站中的resultWrapper),再找一種方式(如XPath)來獲取信息,最后再將信息存到可讀的對象中(本例中先存在flight_containers中,再存在flights_list中)。
我把前三個結(jié)果詳細內(nèi)容都打印出來了,里面有我們需要的全部有用信息,但我們還是要找個更好的方法提取它們,這時我們就要對這些元素單獨解析。
開始爬數(shù)據(jù)!
最簡單的代碼就是讀取更多這個函數(shù),我們先從這里開始。我希望在不觸發(fā)安全校驗的情況下獲取盡量多的航班,所以在每次加載完頁面我都會點擊“l(fā)oad more results”按鈕。值得注意的是我用到了try語句,因為有的時候不一定會存在這個按鈕。
哦嘞,前期鋪墊的有點長(抱歉,我確實比較容易跑偏)。我們現(xiàn)在要開始定義用于爬數(shù)據(jù)的函數(shù)了。
我在下文會提到的page_scrape函數(shù)中解析了大部分元素。有時候,返回來的航班l(xiāng)ist中會有兩段行程。我簡單粗暴地把它拆成兩個變量,如section_a_list 和section_b_list。當然,函數(shù)還是會返回一個名為flights_df 的DataFrame對象,有了它我們接下來就可以任意排序并視情況切片或合并。
變量名中帶a的表示第一段行程,帶b的表示第二段行程。接著看下一個函數(shù)。
別急,還有干貨!
到現(xiàn)在為止,我們有用于加載更多結(jié)果的函數(shù),有用于解析這些結(jié)果的函數(shù)。你可以認為這就完事了,可以靠著它們?nèi)ナ謩拥嘏谰W(wǎng)頁了,但我前面還提到過,我們的目標是能給自己發(fā)郵件,當然還能包括一些其他信息。看看下面這個函數(shù)start_kayak,所有這些都在里面。
這需要我們定義一下要查詢的航班的地點和日期。我們會打開kayak變量中的網(wǎng)址,并且查詢結(jié)果會直接按照“best”方式排序。在第一次爬數(shù)之后,我就獲得了頁面上方的價格矩陣數(shù)據(jù)集,它將用于計算均價和最低價,然后和Kayak的預測價(頁面的左上角)一起通過電子郵件發(fā)出。在單個日期搜素時可能導致錯誤,因為這種情況下頁面頂端沒有價格矩陣。
我用outlook郵箱(http://hotmail.com)做了測試。雖然Gmail我沒試過,甚至還有其他各種郵箱,但我想應該都沒問題。而且我前文提到的書中也寫了其他發(fā)郵件的方式,如果你有hotmail郵箱,可以直接在代碼中替換你的郵箱信息,就可以用了。
如果你想知道腳本中某部分代碼的功能,你要把那部分拷出來測試一下,因為只有這樣你才能徹底地理解它。
把代碼跑起來
當然,我們還能把我們前面編的函數(shù)放進循環(huán)里讓它一直執(zhí)行。寫明4個輸入提示,包括起降的城市和起止時間(輸入)。但在測試的時候,我們并不想每次都去輸入這個四個變量,就直接修改4個變量,如注釋的那四行代碼所示。
恭喜各位,至此我們已經(jīng)大功告成了!其實還有很多可以改進的地方,比如我能想到的還可以用Twilio實現(xiàn)發(fā)送短信進而取代郵件。你還能架VPN或者以其他隱蔽的方式,同時通過多個服務器來爬數(shù)據(jù)。還有驗證碼問題,它們總會不時地跳出來,不過這還是有辦法解決的。如果你有比較好的基礎,我覺得你可以試試加上這些功能。甚至你還會想把Excel文件作為郵件的附件一起發(fā)出。
編譯:高延、熊琰、胡笳、蔣寶尚
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關鍵? 在循環(huán)神經(jīng)網(wǎng)絡(RNN)家族中,長短期記憶網(wǎng)絡(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預測分析中的應用:從數(shù)據(jù)查詢到趨勢預判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內(nèi)權威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應對策略? 長短期記憶網(wǎng)絡(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學方法在市場調(diào)研數(shù)據(jù)中的深度應用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎 ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03