前两天在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了。
基本,思路就是上面的这些。