python爬虫:爬取携程航班数据

2023-05-16

python爬虫:爬取携程航班数据

最近在学爬虫,用携程的航班数据练手,顺便记录一下,话不多说下面开始:

一、首先来观察一下携程网的航班信息的网页:

这是一个携程网站的截图
这是一个携程网站的截图,观察可知这是一个动态的网页;别问咋观察的,问就是百度
OK下面我们:
1、f12检查源代码
2、选择network
3、选择XHR
在这里插入图片描述
这个products中存放了当前页面的所有信息哦!至于说咋知道是它的吗,最快的方法就是百度,当然也可以选择自己去猜,打开preview看看代码里有没有我们想要的信息

这里就当已经知道是它了,然后我们点击这个products:
在这里插入图片描述
观察它的头部(headers)信息,Request URL这个是我们访问到它的url需要,然后发现是post请求,那是不是要传参呢,继续向下看:
在这里插入图片描述
看请求头(Request Headers)这里:user-agent这没啥好说的给它一个ua,这个可以写也可以不写,content-type 这个是声明数据类型,这个是我们需要写的!其他的也可以写但是没必要。

下面这些是post请求要传的的参数了,这里我们以深圳-成都的航班为例,毕竟你要告诉网页你要去哪里。
在这里插入图片描述
然后我们预览一下数据:发现是json数据格式
在这里插入图片描述
然后我们找一下数据在哪:
在这里插入图片描述

我们点开routeList列表的第0项,然后点开legs列表,看到flight,当然是点开它,然后就看到了航班信息,我们已经找到了数据。
在这里插入图片描述

好了,到这里就差不多对携程的航班信息网页有了一个了解:
1、首先是post
2、数据格式是json
3.然后航班数据在routeList中

二、代码实现

下面上代码:
1、导入用到的模块

import requests ##这里用requests模块
from fake_useragent import UserAgent ##这个是有各大浏览器user-gengt的模块
import json 

2、下面准备,头部信息(headers)和参数(request_payload)。cookie过长咱也不会换行就这样看吧!其实也可以不传cookie,这里本人就传了演示一下


url="https://flights.ctrip.com/itinerary/api/12808/products"
headers={
    'User-Agent':UserAgent().chrome,##谷歌浏览器的ua
    "Content-Type": "application/json"##声明传入的参数是json类型
    }
request_payload = {"flightWay": "Oneway",
                       "army": "false",
                       "classType": "ALL",
                       "hasChild": 'false',
                       "hasBaby": 'false',
                       "searchIndex": 1,
                       "portingToken": "3fec6a5a249a44faba1f245e61e2af88",
                       "airportParams": [
                           {"dcity": "SZX", 
                           "acity": "CTU", 
                           "dcityname":"深圳" , 
                           "acityname": "成都",
                           "date": "2020-06-27"
                           '''
                           这里的城市名称和三字码还有日期是可以改的,
                           你也可以将他封装成参数,到时给它传参就会返回
                           不同始发地到目的地不同日期的航班信息。
                           '''}]}

3、下面发送post请求,这里要注意请求头中声明了文本格式为json,所以我们要将post请求传入的参数转化为json。

response=requests.post(url,headers=headers,data=json.dumps(request_payload)) ##发送post请求

4、将得到的响应文本转成json对应的python格式*(这里是字典)*

data=json.loads(response.text)["data"]##将json字符串转成字典,并选择data关键字后面的值,它还是一个字典

5、我们已经得到了一个包含6月27号深圳到成都的所有航班的字典data,接下来按照我们在网页上找到数据的步骤,找到第一个航班的数据:

flight0=data.get("routeList")[0].get("legs")[0].get("flight")
##通过关键字一步步往下找,可以借助刚才在网页找数据的步骤,或者借助json在线解析网站,这里不在赘述。

6.到这里我们已经得到了包含第一个航班信息的字典flight0,接下来当然根据自己的需要挑选数据了,这里简单选择几个数据演示一下:

flight_no=flight0.get("flightNumber") ##航班号
plane_type=flight0.get("craftTypeName") ##机型
departuredate=flight0.get("departureDate") ##出发时间
arrivaldate=flight0.get("arrivalDate") ##到达时间
print(flight_no,'---',plane_type,'---',departuredate,'---',arrivaldate)##打印一下

结果:

CZ3621 --- 空客321 --- 2020-06-27 06:30:00 --- 2020-06-27 08:55:00

这里是提取的第一航班的数据那如果想把深圳-成都所有航班信息输入呢,当然是循环就ok:

datalist=data.get("routeList") ##获取routeList列表
for num in range(len(datalist)):
    flight=datalist[num].get("legs")[0].get("flight")##找到航班信息
    flight_no=flight.get("flightNumber") ##航班号
    plane_type=flight.get("craftTypeName") ##机型
    departuredate=flight.get("departureDate") ##出发时间
    arrivaldate=flight.get("arrivalDate") ##到达时间
    print(flight_no,'---',plane_type,'---',departuredate,'---',arrivaldate)
    print('-------------------------------------------------------------------')

结果:(有点多这里截选一部分)

CZ3621 --- 空客321 --- 2020-06-27 06:30:00 --- 2020-06-27 08:55:00
-------------------------------------------------------------------
CZ3457 --- 空客330 --- 2020-06-27 07:00:00 --- 2020-06-27 09:35:00
-------------------------------------------------------------------
8L7741 --- 空客330 --- 2020-06-27 07:45:00 --- 2020-06-27 10:30:00
-------------------------------------------------------------------
Y87741 --- 空客330 --- 2020-06-27 07:45:00 --- 2020-06-27 10:30:00
-------------------------------------------------------------------
HU7741 --- 空客330 --- 2020-06-27 07:45:00 --- 2020-06-27 10:30:00
-------------------------------------------------------------------
CA4330 --- 空客319 --- 2020-06-27 08:00:00 --- 2020-06-27 10:45:00

如果想提取不同始发地到目的地不同日期的航班信息呢,那就将前面的过程封装成一个方法,向里面传参就可以了,话不多说上代码:


#coding=utf-8
import requests
from fake_useragent import UserAgent
import json
city={'深圳':'SZX','无锡':'WUX'}##定义一个存放城市和对应三字码的字典,这里就随便写两个城市
url='https://flights.ctrip.com/itinerary/api/12808/products'
headers={
    'User-Agent':UserAgent().chrome,
    "Content-Type": "application/json" }
def pachong(dcity,acity,date):
    request_payload = {"flightWay": "Oneway",
                           "army": "false",
                           "classType": "ALL",
                           "hasChild": 'false',
                           "hasBaby": 'false',
                           "searchIndex": 1,
                           "portingToken": "3fec6a5a249a44faba1f245e61e2af88",
                           "airportParams": [
                               {"dcity": city.get(dcity),
                                "acity": city.get(acity),
                                 "dcityname":dcity , 
                                 "acityname": acity,
                                "date": date}]}##这里是需要传入的参数
    response=requests.post(url,headers=headers,data=json.dumps(request_payload))#发送post请求
    data=json.loads(response.text)['data']
    datalist=data.get("routeList") ##得到存放所有航班信息的列表
    for num in range(len(datalist)):##遍历所有航班
        flight=datalist[num].get("legs")[0].get("flight")##找到航班信息
        flight_no=flight.get("flightNumber") ##航班号
        plane_type=flight.get("craftTypeName") ##机型
        departuredate=flight.get("departureDate") ##出发时间
        arrivaldate=flight.get("arrivalDate") ##到达时间
        print(flight_no,'---',plane_type,'---',departuredate,'---',arrivaldate)##打印结果
        print('-------------------------------------------------------------------')
    
if __name__=='__main__':
    pachong('深圳','无锡','2020-06-28')

结果:结果:(有点多这里截选一部分)

ZH9801 --- 波音737 --- 2020-06-28 07:30:00 --- 2020-06-28 09:50:00
-------------------------------------------------------------------
CA3587 --- 波音737 --- 2020-06-28 07:30:00 --- 2020-06-28 09:50:00
-------------------------------------------------------------------
KY9201 --- 波音737 --- 2020-06-28 07:30:00 --- 2020-06-28 09:50:00
-------------------------------------------------------------------
SC9801 --- 波音737 --- 2020-06-28 07:30:00 --- 2020-06-28 09:50:00
-------------------------------------------------------------------
CA3589 --- 波音737 --- 2020-06-28 09:40:00 --- 2020-06-28 12:10:00
-------------------------------------------------------------------
KY9203 --- 波音737 --- 2020-06-28 09:40:00 --- 2020-06-28 12:10:00
-------------------------------------------------------------------
SC9803 --- 波音737 --- 2020-06-28 09:40:00 --- 2020-06-28 12:10:00
-------------------------------------------------------------------
ZH9803 --- 波音737 --- 2020-06-28 09:40:00 --- 2020-06-28 12:10:00
-------------------------------------------------------------------
CA3591 --- 波音737 --- 2020-06-28 10:40:00 --- 2020-06-28 13:10:00
-------------------------------------------------------------------
KY9805 --- 波音737 --- 2020-06-28 10:40:00 --- 2020-06-28 13:10:00
-------------------------------------------------------------------
SC9805 --- 波音737 --- 2020-06-28 10:40:00 --- 2020-06-28 13:10:00
-------------------------------------------------------------------
ZH9805 --- 波音737 --- 2020-06-28 10:40:00 --- 2020-06-28 13:10:00

以上就是爬取携程航班信息的过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫:爬取携程航班数据 的相关文章

  • 如何设计一个锂电池充电电路(TP4056)

    这个是个单节18650锂电池的充电模块 xff0c 这个是个18650的锂电池 xff0c 18指的是它的直径是18mm xff0c 65指的是它的高度为65mm 这个18650电池的标称电压是3 7V xff0c 电池充满时电压为4 2V
  • ajax请求携带自定义请求头header(跨域和同域)

    1 ajax跨域请求 xff08 无cookie 无header xff09 案例 xff08 java xff09 xff08 1 xff09 启动一个java web项目 xff0c 配置两个域名 xff08 host xff09 cz
  • VSCode如何直接打开html文件

    用VSCode的同行越来越多 xff0c 但是有人功能还不太熟练 xff0c 是不是有点小尴尬啊哈哈 功能实现 xff1a 直接打开Html 操作步骤 xff1a 快捷键 Ctrl 43 shift 43 x 打开vscode的应用商店 x
  • ubuntu18.04微信安装

    先安装一下wine wget O https deepin wine i m dev setup sh sh 若出现不能解析https的问题 xff0c 则 echo 39 nameserver 8 8 8 8 39 gt gt etc r
  • rstudio r语言_R语言的重大更新带来了巨大的变化

    rstudio r语言 用于统计计算的R语言版本4 0 0已发布 xff0c 其中对语言的语法以及与错误检查和长向量有关的功能进行了更改 升级版于4月24日发布 R 4 0 0的源代码可从cran r project org访问 R是一个G
  • 【千律】C++基础:编写实现自定义的字符串拼接函数

    include lt iostream gt using namespace std char strconnect char str 1 char str 2 int len 1 int len 2 初始化字符串 str 1 的 int
  • OpenWrt路由开启DDNS+端口转发进行外网访问

    OpenWrt路由开启DDNS 43 端口转发进行外网访问 xff08 LuCI界面实现 xff09 开篇一 准备工作二 开机 xff01 三 连接 结尾 开篇 本篇适用于一切装有OpenWrt系统的路由器 软路由 xff0c 只要你保证有
  • c语言概念题

    任何表达式语句都是表达式加分号组成的 C语言程序是从源文件的第一条语句开始执行的 xff08 x 从main函数开始执行 C 语言中的变量名区分大小写 运算符优先级以及结合方式 1 初等运算符 xff1a xff08 xff09 取结构体变
  • c 语言概念题【最全整理】

    任何表达式语句都是表达式加分号组成的 C语言程序是从源文件的第一条语句开始执行的 xff08 x 从main函数开始执行 C 语言中的变量名区分大小写 运算符优先级以及结合方式 1 初等运算符 xff1a xff08 xff09 取结构体变
  • python中变量的命名以及使用

    一 变量的概念 变量名只有在第一次出现的时候 xff0c 才是定义变量 当再次出现时 xff0c 不是定义变量 xff0c 而是直接使用之前定义的变量 1 变量命名 1 xff09 命名的规范性 变量名可以包括字母 数字 下划线 xff0c
  • WSL 导入导出迁移 相关命令

    wsl export Ubuntu D Ubuntu tar wsl unregister Ubuntu wsl import Ubuntu D Ubuntu D Ubuntu tar version 2 ubuntu exe config
  • 2019年3月PAT甲级认证经验教训总结~~~路还很长,慢慢来

    今天的PAT认证是我人生中的第二次算法考试 xff0c 第一次是六年前大一学习 C 语言时学校举行的算法比赛 跟第一次一样 xff0c 这次考得也非常失败 xff0c 只做出来前两道题 去年七月份辞职跨专业考研 xff0c 选了自己感兴趣的
  • ubuntu系统代理配置

    vim etc apt apt conf Acquire http proxy http username password 64 192 168 1 1 8080
  • Linux 软件包管理常用命令

    安装软件包 apt get install packagename 删除软件包 apt get remove packagename 更新软件包列表 apt get update 升级有可用更新的系统 xff08 慎用 xff09 apt
  • flask框架初学-11-解决跨域问题

    在前面的学习中 xff0c 我们都是在本地起服务 xff0c 再在本地访问资源及界面 xff0c 但是实际当中都是开启多台服务器 xff0c 提供给局域网外的用户访问 这就牵涉到了跨域问题 xff0c 跨域问题来源于同源策略 xff0c 同
  • CSP-序列查询新解(C++简单易懂)

    题目背景 上一题 序列查询 中说道 xff1a A 61 A0 A1 A2 An 是一个由 n 43 1 个 0 N 范围内整数组成的序列 xff0c 满足 0 61 A0 lt A1 lt A2 lt lt An lt N 基于序列 A
  • 九、51单片机之直流电机驱动

    目录 1 什么是电机 2 常见电机 2 1 交流电机 2 2 交流电机补充 可跳过 2 3 直流电机 2 4 步进电机 伺服电机 3 直流电机驱动 1 什么是电机 1 电机的全称是电动机 xff0c 把电能转换成动能的一种电器 2 外观 2
  • 【Linux】 Linux下查询CPU、内存、硬盘、服务器型号、出厂日期

    一 查看CPU 1 1 查看CPU个数 cat span class token operator span proc span class token operator span cpuinfo span class token oper
  • 1.5 字符

    输入 输出 getchar putchar 1 5 1 文件复制 include lt stdio h gt 将输入复制到输出 xff1b 版本1 main int c c 61 getchar while c 61 EOF putchar
  • docker基础学习入门(六)------ DockerFile解析

    DockerFile是什么 Dockerfile是用来构建Docker镜像的构建文件 xff0c 是由一系列命令和参数构成的脚本 构建三步骤 xff1a 编写Dockerfile文件docker builddocker run 构建的文件什

随机推荐

  • mysql小练习

    设教学数据库Education有三个关系 xff1a 学生关系S xff08 SNO xff0c SNAME xff0c AGE xff0c SEX xff0c SDEPT xff09 xff1b 学系关系SC xff08 SNO xff0
  • C++ 快速幂取模运算理解

    C 43 43 快速幂取模运算理解 概念非递归方法原理代码实例 递归方法原理代码实例 概念 快速幂运算也叫反复平方法 顾名思义 xff0c 算法就蕴含在名字中 非递归方法 原理 假设要求 x 2 x 2 x 2
  • 01迷宫(洛谷)

    题目描述 有一个仅由数字 000 与 111 组成的 n nn times nn n 格迷宫 若你位于一格0上 xff0c 那么你可以移动到相邻 444 格中的某一格 111 上 xff0c 同样若你位于一格1上 xff0c 那么你可以移动
  • VSCode + Latex +Texlive 编译 biber格式参考文献时 VSCode的配置方法

    34 editor fontSize 34 17 34 files autoSave 34 34 onFocusChange 34 34 latex workshop showContextMenu 34 true 34 latex wor
  • 更换国内镜像源进行pip安装【附带国内镜像源】

    Linux中当我们需要安装某个模块时 xff08 比如tensorflow2 0 0 xff09 xff0c 常见有三种方法 xff1a pip install tensorflow 61 61 2 0 0pip install https
  • C/C++中如何遍历枚举类型?

    在C 43 43 中 xff0c 写一段代码 xff0c 把某个enum中的所有元素放入到vector中 xff0c 方便遍历 假设有以下的枚举类型 xff1a span class token comment c 43 43 span s
  • 201609-3 炉石传说

    201609 3 炉石传说 题意描述 本题要求我们去模拟一款游戏的运行 xff0c 游戏分为双方 轮流操作 操作共有三种形式 summon attack end 输入输出格式 输入 n 接下来是 n 个操作 每个操作由字符串区分 后面是操作
  • 超详细Windows10/Windows11 子系统(WSL2)安装Ubuntu20.04(带桌面环境)+CUDA11.3+pytorch1.8.1+pycharm

    超详细Windows10 Windows11 子系统 xff08 WSL2 xff09 安装Ubuntu20 04 xff08 带桌面环境 xff09 user zhaowei的博客 CSDN博客 wsl 桌面环境 目录前言在Windows
  • 洛谷_P1825 [USACO11OPEN]Corn Maze S(尚贤)

    题目 xff1a https www luogu com cn problem P1825 span class token macro property span class token directive keyword include
  • 从知名软件提取出的神器,吊打一众付费

    前言 现在的软件功能虽然越更新越多 xff0c 但也是越来越臃肿了 xff0c 不仅占内存 启动慢 xff0c 老更新也怪麻烦的 你们应该也有过因为某个小功能挺好用而不忍心卸载整款软件的情况吧 今天给大家分享几款从知名软件中提取出来的小工具
  • Ubuntu 设置网络代理的一些配置

    因公司需求 xff0c 连接网络必须使用代理设置连接网络 xff0c 这里给大家分享一下我的配置步骤 xff01 如果以下这些不符合你的需求 xff1a 来看这个 xff1a ubuntu 内网搭建服务器的一些配置 xff0c 完美解决ht
  • Linux上git+gitee的基本使用

    目录 1 git 2 gitee 3 本地仓库建立和git基本使用 1 远程仓库同步到本地仓库 xff1a 2 提交本地仓库到远程仓库进行更新 如在本地代码仓库中新建了test1 txt和test2 txt文件或者对文件内容进行了修改 xf
  • java编程题练习2

    程序6 题目 xff1a 输入两个正整数m和n xff0c 求其最大公约数和最小公倍数 在循环中 xff0c 只要除数不等于0 xff0c 用较大数除以较小的数 xff0c 将小的一个数作为下一轮循环的大数 xff0c 取得的余数作为下一轮
  • 安装Anaconda后,cmd输入python没有结果

    可能是电脑上已经安装过python xff0c 在cmd中输入 where python 查看电脑上所有python解释器所在的路径 路径优先级最高的解释器 xff08 非Anaconda所在路径 xff09 出现损坏 xff0c 或由于其
  • 用python发送163邮件

    邮件是最早有用计算机通信的方式之一 xff0c 采用pop3协议接受邮件 xff0c smtp协议发送邮件 xff0c 基本上所有的计算机通信建立在tcp udp协议之上 xff0c 邮件传输协议也是不列外的 如果想要用编程语言发送邮件 x
  • 【AWS EC2】云端简单部署NodeJS应用

    根据需要启动想要的EC2 注意 xff1a 选择Linux时用x86而不是arm xff0c 不然kafka和zookeeper启动不了 xff08 在我的项目里 xff09 并且bitnami zookeeper latest需要内存超过
  • 在kali linux上安装git与push提交

    在kali linux上安装git与push提交 写在前面 xff1a 最好不要在root账户下创建 xff0c 在使用vscode时会带来好多问题 1 安装git apt get install git 2 添加git服务用户 邮箱 xf
  • 判断一颗二叉树是否为完全二叉树

    package main import 34 container list 34 思路 层序遍历 只需分两种情况 1 xff09 若当前节点左孩子为空右孩子不为空 直接返回不空 2 xff09 若当前节点的左右孩子不全 则其后面的节点必须都
  • 【mybatis-plus】mybatis-plus代码生成器,自动生成controller、service、dao、mapper、pojo代码,可灵活配置生成路径,程序猿的福音!!!

    在我们需要一些数据库的实体类时 xff0c 需要手动创建实体与类 xff0c 这很浪费时间 xff0c 所以我研究了一下和上网找了一些资料 xff0c 整合出了一套可灵活配置生成路径的代码 xff01 xff01 xff01 直接上代码 s
  • python爬虫:爬取携程航班数据

    python爬虫 xff1a 爬取携程航班数据 最近在学爬虫 xff0c 用携程的航班数据练手 xff0c 顺便记录一下 xff0c 话不多说下面开始 xff1a 一 首先来观察一下携程网的航班信息的网页 xff1a 这是一个携程网站的截图