前兩天在BOSS上找爬蟲工作,投了N份簡歷,很少有回復的,唯一能看到點希望的是一家旅游公司,BOSS上回復說:要求做一些航空公司的爬蟲,做好之后把思路和一些數據發過去,再談后續的面試問題。
發過來兩個爬蟲項目,說如果面試通過,會根據所選的爬蟲項目進行工資定級,我選了這個據說是難度更大一些的:airasia.com。
花了兩天時間,搞定了這個爬蟲,按要求把采集到的一部分數據和爬蟲思路發送過去,結果是無人回復,我覺得,這份面試的機會,也這樣悄悄的,被別人擁有了吧~
也可能是我的簡歷太水,做過的一些爬蟲項目什么的,懶的往網上發,也不喜歡總結,結果找工作的時候沒有可拿的出手的東西,年紀也快30了,兩三年的爬蟲工作經歷又沒有優勢,拿什么和人家爭。
以后養成好習慣吧,把做過的東西整理好,作為以后個人的資歷。
# ----- 正題 -----
目的:采集指定日期內的所有航班的信息
語言:Python
框架:Scrapy
系統:Mac
抓包:Charles
反爬:動態代理、輪換請求頭
分析:想要得到航線的詳細信息,隨便找一個航線,Charles抓包,就能看到一個這個的地址:
“https://k.airasia.com/shopprice/0/0/TPE/DPS/2019-03-06/1/0/0”
里面包含有當天有幾趟航班、航班時間、地點、機倉類型、是否轉機、轉哪趟等詳實信息,所以我要拿的就是這個頁面。

現在的問題就是如何拿
在瀏覽器->開發者->Headers界面中,copy curl就可以拿到所有需要的信息,使用requests或者scrapy的方法進行請求,看能不能成功請求到上面的信息?
curl 'https://k.airasia.com/shopprice/0/0/TPE/DPS/2019-03-06/1/0/0' -H 'Accept: application/json, text/plain, */*' -H 'Referer: https://www.airasia.com/booking/select/zh/cn/TPE/DPS/2019-03-06/N/1/0/0/O/N/CNY/SC' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36' -H 'X-Custom-Flag: 1' -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJBMXoyUWloUEtXSWdtYlJ3a0ExWXpHcjNobFZKN1hJMiIsImlhdCI6MTU0NDQzODIwOCwiZXhwIjoxNjA3NTk2NjA4LCJhdWQiOiJQV0EgRGV2Iiwic3ViIjoicHJhZGVlcGt1bWFyckBhaXJhc2lhLmNvbSJ9.QJPYvJvzx8IZFP6mYTAKwva7eQ_DVT_4JRwk75Uhhd8' --compressed
有一些疑惑,這里的cookie清除掉之后,仍然可以訪問,但Authorization這個值,我沒有拿到,通過搜索,我找到了這個值的位置,在js文件main.***.js之中。
而main后面跟隨的那串字符是不固定的,前幾天我做測試時一直沒變,但今天寫這篇文章時,就失效了,說明這不是一個永久鏈接,會隨時變化,再查找這串字符,它在網站ngsw中,這樣,最重要的一個信息,就能拿到了。
還有referer的值,這是包括航班起落點、起飛時間的值
https://www.airasia.com/booking/main.434aa9bdbcf8c08efda4.js
https://www.airasia.com/booking/ngsw.json
referer: https://www.airasia.com/booking/select/zh/cn/KUA/PVG/2019-02-25/N/1/0/0/O/N/CNY/SC
信息已經可以拿到了,這是最終一步,繼續反推,我們需要知道從哪里出發
還是要用Charles抓到的包,或者在瀏覽器->開發者中進行分析,分析始發、降落點信息在哪。
最終得到了兩個網站
https://sch.apiairasia.com/station/zh-cn/file.json
https://sch.apiairasia.com/stationoperate/zh-cn/file.json
以及這個:
https://sch.apiairasia.com/destination/kua/file.json
上面兩個站都是航站列表,下面的,則是通過KUA編碼航站樓可去往的地點。
我不知道那兩個列表中到底哪個才是可起飛的站點,不過多試總比錯過強,我把請求得到的數據進行了一下對比,station這個要比stationperate的站點要多,那我就假設它是起飛站的列表了,
通過for循環拼接destination的url地址就能得到所有可到達的起落點信息。
再把航線拼接成搜索頁的正確形式傳遞,就OK了。
基本,思路就是上面的這些。
