python爬取京东机票,监控机票,机票价格分析
来源:互联网 发布:怎么看网络直播 编辑:程序博客网 时间:2024/04/28 04:32
又到了一年一度的国庆假期。今年国庆、中秋撞到一起,所以打算回家过节。从帝都到海口,每到节假日的机票都是全价票…2400大洋的单程票,消费不起呀!所以为了买到便宜点的机票,我就写了一个简单的爬虫来监控机票价钱。
可能有人会觉得,阿里飞猪,携程什么的都有监控,何必自找麻烦。对于一个程序员来说,能自己做到的事情就不会去使用别人的东西。而且他们的产品不一定能满足我的需求啊。废话不多说,正文分割线!
分析目标地址
跟以前一样,爬虫第一件事。分析目标,看他是怎么处理机票查询。
地址:https://jipiao.jd.com/
进入查询页面后,发现京东查机票。一共发了三个异步的get请求来请求机票数据。
这里,我也没弄明白为什么京东要使用3个请求来获取机票信息。多次测试发现,这三个请求中会有概率查不到机票。既然这样,我们代码中也请求三次,直到拿到机票结果信息。
构建请求
首先我们需要构建一个get请求,把参数一起传过去。
#模拟请求头(可以根据自己浏览器访问,直接copy过来。)headers = { 'Host': "jipiao.jd.com", 'Accept-Language': "zh-CN,zh;q=0.8,en;q=0.6", 'Accept-Encoding': "gzip, deflate, br", 'X-Requested-With' : 'XMLHttpRequest', 'Connection': "keep-alive", 'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36" } #requests.session(),这样的requests请求,会带上前一次请求的sessionid roon_session = requests.session() #请求所携带的参数。需要哪些参数,分析目标地址。 payload = {'depCity': '海口', 'arrCity': '北京', 'depDate': '2017-10-08', 'arrDate': '2017-10-08', 'queryModule': '1', 'lineType': 'OW', 'queryType': 'jipiaoindexquery'} #请求目标 url = 'https://jipiao.jd.com/search/queryFlight.action' #以json分方式读取请求结果(结果返回的是一个json) page = roon_session.get(url,headers=headers, params=payload,proxies=proxies).json()
非常简单,几行代码。我们的请求url就构建好了。以上代码直接就能拿到京东的机票查询结果。注释我都写在代码上了,非常简单易懂,这里就不多说。
完整代码
请求代码写完之后,基本上就没有什么东西。 接下来基本上是看你如何去做这个请求。主要是程序的完整性,如何去避免产生问题使程序不能继续执行。
这里我是参照京东自己的三次请求,来写这部分的逻辑。
def Get_Plan_Money(): times = 1 headers = { 'Host': "jipiao.jd.com", 'Accept-Language': "zh-CN,zh;q=0.8,en;q=0.6", 'Accept-Encoding': "gzip, deflate, br", 'X-Requested-With' : 'XMLHttpRequest', 'Connection': "keep-alive", 'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36" } # 使用代理 proxies = { # 'http': 'http://1.31.23.209:80', # 'http': 'http://110.243.166.164', } roon_session = requests.session() #代理测试部分 # url = 'http://ip.chinaz.com/' # page = roon_session.get(url,proxies = proxies).text # print (page) # exit() payload = {'depCity': '海口', 'arrCity': '北京', 'depDate': '2017-10-08', 'arrDate': '2017-10-08', 'queryModule': '1', 'lineType': 'OW', 'queryType': 'jipiaoindexquery'} url = 'https://jipiao.jd.com/search/queryFlight.action' page = roon_session.get(url,headers=headers, params=payload,proxies=proxies).json() if page['data']['flights'] is None: # payload = {'depCity': '海口', 'arrCity': '北京', 'depDate': '2017-10-08', 'arrDate': '2017-10-08', 'queryModule': '1', # 'lineType': 'OW', 'queryType': 'jipiaoindexquery','queryuuid':page['data']['queryuuid']} times = 2 print ('已进行二次请求') page = roon_session.get(url, params=payload, headers=headers, proxies=proxies).json() # if page['data']['flights'] is None: # print(page) # exit() # 为了确保能发送,这里再进行第三次请求(京东的http 请求了四次。) if page['data']['flights'] is None: print('已进行第三次请求') times = 3 page = roon_session.get(url, params=payload, headers=headers, proxies=proxies).json() # 为了确保能发送,这里再进行第四次请求(京东的http 请求了四次。) if page['data']['flights'] is None: print('已进行第四次请求') times = 4 page = roon_session.get(url, params=payload, headers=headers, proxies=proxies).json() # 为避免第四次请求仍未成功引起程序报错 if page['data']['flights'] is None: print('四次请求均未成功') # exit() print '%s 从%s飞往%s的飞机'%('20171008','海口','北京') print '一共查询到%s个航班'%(len(page['data']['flights'])) # 创建列表来保存机票价钱 money_list = [] for plan in page['data']['flights']: print '%s%s-最低价:%s' % (plan['airwaysCn'], plan['flightNo'], plan['bingoLeastClassInfo']['price']) money_list.append(plan['bingoLeastClassInfo']['price']) # 将列表排序 money_list.sort() # print (money_list) return money_list
主要还是,判断返回的机票数据是否存在,如果不存在再进行一次请求。以上代码,我用定时任务跑了两周,没有出现过一次错误。
运行结果
完善功能
拿到了机票数据,我们就可以做很多事情了。
比如我就做了一个简单的邮件系统,每半个小时监控我设定好的数据,然后给我发一封邮件。上班的时候,每半个小时,一个弹窗我就知道机票价格有没有变动,非常直观。
或者使用这些变化的机票,用来做数据分析。比如国庆期间,哪个航线的机票最便宜,打折力度最大。作为自己国庆出行的一个参考。
当然还可以做很多事情,只要你拿到了这些数据,利用起来是很有价值。
- python爬取京东机票,监控机票,机票价格分析
- 机票预定系统可行性分析
- 《爬取京东机票一周最低价格》
- 机票常识
- 机票助手
- 机票 NFD
- 机票系统
- 订机票
- 机票预订系统的可行性分析
- 机票预订系统的可行性分析
- 机票大讲堂之机票的秘密
- 改签机票参考
- 机票预订信息收藏
- 收到机票啦
- 机票查询接口
- 机票查询代码程序
- 机票预定常用词汇
- 机票预订系统
- 计蒜客: 最大的快乐指数(树形DP)
- javaweb未全站https化,因tomcat版本导致站内http请求出错解决
- MySQL中存储过程无限报错的问题(delimiter)
- JavaScript学习笔记-02对象创建方式
- mem类函数
- python爬取京东机票,监控机票,机票价格分析
- Python3中import cv2时出现ImportError: DLL load failed 解决办法
- Java 8的新特性—终极版
- JavaScript学习笔记-03函数调用方式
- PAT甲级1135----红黑树题解
- [洛谷 3386]【模板】二分图匹配---匈牙利算法
- 字符编码笔记:ASCII,Unicode和UTF-8
- C++动态库与静态库学习
- 使用JavaScript实现在页面中显示距离2017年中秋节的天数