Python-东方航空最低票价

介绍

通过运用Python编程语言,我们可以实现自动化抓取与分析东方航空公司的最低票价信息。在这篇文章中,我们采用了一系列的技术手段,包括利用requests库发起POST请求至东方航空官网API接口,以获取特定航线的最低价机票详情;随后借助pandas库对所获得的数据进行清洗、整理和计算统计,最终生成了一张直观的柱状图以及一份详细的Word文档报告。

首先,程序模拟用户访问东方航空网站,设定特定的请求头信息,包括接受的数据格式、会话标识以及其他必要参数,确保能够正确地从指定的API地址(https://www.ceair.com/portal/v3/shopping/querySummaryPrice)取得航班报价数据。在这个例子中,目标航线是从广州飞往杭州的一次性往返机票。

数据采集阶段,通过构造符合API要求的JSON格式数据包,包含了航班出发城市编码(CAN)、到达城市编码(HGH,HHL,HZD),以及期望查询的舱位等级等信息。API响应的数据经过解析后,提取出每一航段的最低价格、税费及票价明细。

为了确保数据处理的健壮性,程序针对每个关键字段进行了类型转换(将字符串转为浮点数)并处理了可能存在的空值(None)。之后,这些处理过的数据被组织成一个列表,并进一步转化为pandas DataFrame,便于后续的数据分析操作。

在数据分析环节,程序计算了所有航班的总价格(票价加上税费)、平均价格、最高价格和最低价格。为了可视化这些数据,采用了matplotlib库创建了一个柱状图,展示了不同日期航班的总价情况,并将图表保存为PNG格式文件。

最后,利用python-docx库创建了一份Word文档报告,其中包含了一些重要的统计信息,如平均价格、最高含税价格(以醒目红色字体呈现)和最低含税价格(以醒目的绿色字体呈现)。此外,还生成了一个包含详细航班价格信息的表格,以及将上述柱状图嵌入到了文档中,使得报告图文并茂,易于阅读。
在这里插入图片描述

本案例演示了如何通过Python自动化地获取并深入分析东方航空的最低票价数据,从而为消费者或业务人员提供了实用的决策依据。而整个流程中涉及的图片(您已上传但未在此处显示)应当是一张反映各航班总价对比的柱状图,这张图作为分析结果的重要组成部分,被整合到了最终的Word文档报告中。

完整代码

import requests
import pandas as pd
import matplotlib.pyplot as plt
from docx import Document
import os

from docx.shared import RGBColor, Inches

#广州->杭州
url="https://www.ceair.com/portal/v3/shopping/querySummaryPrice"

headers={
"Accept":"application/json, text/plain, */*",
"Accept-Encoding":"gzip, deflate, br, zstd",
"Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Content-Length":"223",
"Content-Type":"application/json;charset=UTF-8;",
"Cookie":"inter=ZjQxMGFlMjctMzczOC00ZWUwLTlmODYtMGY2MzE0YTBlYjE2; HMF_CI=c0331ead3cce47358c430a26709b311edb4ab68ec1e2bd151b032825c8416235df7e718926ff7464788e5e58fb5193dba02eb58d02bef55ae4747afa588a484dbc; sajssdk_2015_cross_new_user=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218f2d69c9f450a-01d0df9f5bef6cd-4c657b58-1327104-18f2d69c9f542%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E8%87%AA%E7%84%B6%E6%90%9C%E7%B4%A2%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fcn.bing.com%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThmMmQ2OWM5ZjQ1MGEtMDFkMGRmOWY1YmVmNmNkLTRjNjU3YjU4LTEzMjcxMDQtMThmMmQ2OWM5ZjU0MiJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218f2d69c9f450a-01d0df9f5bef6cd-4c657b58-1327104-18f2d69c9f542%22%7D; HBB_HC=4d89a4e02db6dfd994b8e7ed3f29d9e20edb1ac5258e0232fd5f35aba4a868d8e9c9ee9645182b92a3e924afde09659c78; gioCookie=yes; gr_user_id=db02aaf4-a938-471a-b77a-318dd942a9a8; 84bb15efa4e13721_gr_session_id=3a737636-335d-4fef-8f05-e807058f19e0; 84bb15efa4e13721_gr_session_id_sent_vst=3a737636-335d-4fef-8f05-e807058f19e0; acw_tc=ac11000117144538728987925e9d9a7cbdc14b2a67d46bd1a53f236fe1a0d8; i18n_site=zh_CN; arialoadData=true; ariawapChangeViewPort=false",
"Origin":"https://www.ceair.com",
"Priority":"u=1, i",
"Referer":"https://www.ceair.com/shopping?eyJ0cmF2ZWxUeXBlIjoib25ld2F5IiwicGFzc2VuZ2VyTnVtIjoiMSwwLDAiLCJkZXBDaXR5IjoiQ0FOIiwiYXJyQ2l0eSI6IkhHSCIsImRlcFZhbHVlcyI6IkNBTiIsImFyclZhbHVlcyI6IkhHSCxISEwsSFpEIiwiZGVwQ2l0eU5hbWUiOiLlub/lt54iLCJhcnJDaXR5TmFtZSI6IuadreW3niIsImRhdGUiOiIyMDI0LTA0LTMwIiwiY2FiaW5DbGFzcyI6IkFMTCIsInBheVdheSI6Im1vbmV5IiwiZGVwU2VsZWN0VmFsdWUiOiJDQU4iLCJhcnJTZWxlY3RWYWx1ZSI6IkhHSCxISEwsSFpEIiwiZGVwTGFiZWwiOiIiLCJhcnJMYWJlbCI6IiIsImlzQXJyQ2l0eSI6dHJ1ZSwiaXNEZXBDaXR5Ijp0cnVlLCJhcnJDbiI6IkNOIiwiZGVwQ24iOiJDTiIsInQiOjE3MTQ0NTQwMjc5MzB9encoded",
"Site":"zh_CN",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
"X-Tingyun-Id":"DuR5xFLm8eI;r=454068856"
}

data={
'flightItems': [{ 'arrCityCode':"HGH",'arrCode':"HGH,HHL,HZD",'depCityCode':"CAN",'depCode':"CAN",'depDt':"2024-04-30",'index':1}],
'preference': {'cabinRank': "F,J,Y", 'currencyCode': "CNY", 'lowestControl': "1"},
'routeType': "OW"
}
resp_json = requests.post(url=url,headers=headers,json=data).json()


segmentLowestPriceList=resp_json['segmentLowestPriceList']
for segmentLowestPrice in segmentLowestPriceList:
    flightDate=segmentLowestPrice['flightDate']
    lowestPrice=segmentLowestPrice['lowestPrice']
    taxFee=segmentLowestPrice['taxFee']
    ticketPrice=segmentLowestPrice['ticketPrice']


# 在构建data_list时进行类型转换
# 在构建data_list时进行类型转换,同时处理可能的None值
data_list = []
for segmentLowestPrice in segmentLowestPriceList:
    flightDate = segmentLowestPrice.get('flightDate', '')
    lowestPrice = float(segmentLowestPrice.get('lowestPrice', 0)) if segmentLowestPrice.get('lowestPrice') else None
    taxFee = float(segmentLowestPrice.get('taxFee', 0)) if segmentLowestPrice.get('taxFee') else None
    ticketPrice = float(segmentLowestPrice.get('ticketPrice', 0)) if segmentLowestPrice.get('ticketPrice') else None

    # 检查最低价格、税费和票价是否为None,如果是则不添加该条目
    if lowestPrice is None or taxFee is None or ticketPrice is None:
        continue

    data_list.append({
        'flightDate': flightDate,
        'lowestPrice': lowestPrice,
        'taxFee': taxFee,
        'ticketPrice': ticketPrice
    })

# 使用转换后的data_list创建DataFrame
df = pd.DataFrame(data_list)


# 数据分析
total_prices = df['ticketPrice'] + df['taxFee']
average_price = total_prices.mean()
max_price = total_prices.max()
min_price = total_prices.min()

# 绘制图表并保存为图片
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False  # 保证负号正常显示
plt.figure(figsize=(10, 6))
plt.bar(df['flightDate'], total_prices)
plt.xlabel('飞行日期')
plt.ylabel('总价(含税)')
plt.title('每趟航班总价')
plt.xticks(rotation=45)
chart_path = 'price_chart.png'
plt.savefig(chart_path)
plt.close()

# 创建Word文档
doc = Document()
doc.add_heading('广州->杭州机票价格分析', 0)

# 添加平均价格段落
doc.add_paragraph(f'平均价格: {average_price}')

# 添加最大含税价格并高亮显示
max_price_para = doc.add_paragraph(f'最大含税价格: {max_price}')
max_price_run = max_price_para.runs[0]
max_price_run.font.color.rgb = RGBColor(255, 0, 0)  # 设置红色字体

# 添加最小含税价格并高亮显示
min_price_para = doc.add_paragraph(f'最小含税价格: {min_price}')
min_price_run = min_price_para.runs[0]
min_price_run.font.color.rgb = RGBColor(0, 128, 0)  # 设置绿色字体

# 添加表格
table = doc.add_table(rows=1, cols=4)
header_row = table.rows[0]
header_row.cells[0].text = '飞行时间'
header_row.cells[1].text = '含税价格'
header_row.cells[2].text = '税费'
header_row.cells[3].text = '不含税价格'

# 填充表格数据
for index, row_data in df.iterrows():
    new_row = table.add_row()
    new_row.cells[0].text = row_data['flightDate']
    new_row.cells[1].text = str(row_data['lowestPrice'])
    new_row.cells[2].text = str(row_data['taxFee'])
    new_row.cells[3].text = str(row_data['ticketPrice'])

# 插入图表到Word文档
doc.add_page_break()  # 添加分页符,以便图表位于新页面
doc.add_picture(chart_path, width=Inches(6))

doc.save('机票.docx')

# 清理临时图片文件
os.remove(chart_path)```

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

净网平台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值