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

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

python爬携程_Python crawler:对携程的航班数据进行抓取,python,爬虫,爬取相关推荐

  1. python从网址爬图片协程_python 用 gevent 协程抓取海量网页

    python作为爬虫利器,抓网页的方式简洁明了.爬成百上千的网页,都可以很快爬完,但是如果网页数量上万呢?速度就不能忍受了. 这是一段爬取页面的函数,用了requests库:1 2 3 4 5impo ...

  2. python网络编程库_Python网络编程——协程

    协程的概念 协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字 ...

  3. python均线选股_python选股模型均线,已知股票数据,如何用Python绘制k线日对应数据...

    Q1:已知股票数据,如何用Python绘制k线日对应数据 我没遇到过 只是自己写过 有点经验 先确定时间片 然后再把tick插入就行了 Q2:使用python实现ema(指数移动平均的计算) a =  ...

  4. python爬虫获取的网页数据为什么要加[0-python3爬虫爬取网页思路及常见问题(原创)...

    学习爬虫有一段时间了,对遇到的一些问题进行一下总结. 爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save). 下面分别说下这几个过程中可以 ...

  5. python java 爬数据_如何用java爬虫爬取网页上的数据

    当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...

  6. python有什么优点_Python是什么?有什么优点?赶紧来看看Python的入门教程

    Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结 ...

  7. 数据收集-抓包与反爬

    抓包与反爬 常见的反爬手段 反爬原因 反爬常见概念 反爬的三个方向 基于身份识别进行反爬 通过headers字段来反爬 通过请求参数来反爬 常见基于爬虫行为进行反爬 基于请求频率或总请求数量 根据爬取 ...

  8. python2协程_python中的协程(二)

    协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他 ...

  9. python入门教程收藏_python入门教程:超详细保你1小时学会Python,快来收藏看看...

    简介:简介(转发文章+私信[Python]获取资料方式)1.Hello world安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行 ...

  10. python显示控制台行情_python命令行查看股票基本行情数据

    写了一个Python版本的小工具,可以在上班的时候刷一下你关注的股票信息.Python版本用的是3.4.1的,代码如下: #!/usr/bin/env python # -*- coding:utf- ...

最新文章

  1. KDE Applications 19.04 发布,包含大量更新
  2. JAM - how count is got - SAP Fiori和JAM的集成
  3. lombok进行有参无参构造出现的问题
  4. H3C 三种生成树协议特性的比较
  5. 腾讯微博Android客户端开发——自动获取验证码
  6. mysql报错last packet_mysql The last packet successfully received
  7. JVM(六)为什么新生代有两个Survivor分区? 1
  8. 解决Firefox访问EBS时提示激活Java插件的问题
  9. 无锁数据结构--理解CAS、ABA、环形数组
  10. 堆栈应用(三):火车车厢重排
  11. win10使用navicat管理数据库
  12. Python全栈(四)高级编程技巧之4.元类编程、迭代器和生成器
  13. 不同浏览器中手动启用Flash Player
  14. select标签如何设置默认选中的选项
  15. idea快速切换不同JDK版本
  16. 轻量化安装 TKEStack:让已有 K8s 集群拥有企业级容器云平台的能力
  17. Python学习之字典练习(重复数字统计)
  18. JavaScript知识点整理(十六)- PC端网页特效 - 案例练习
  19. 中国图形图象学报和计算机科学,lbrack;中国图象图形学报rsqb;参考文献格式
  20. Rogue Signs: Deceiving Traffic Sign Recognition with Malicious Ads and Logos

热门文章

  1. 自用Markdown颜色字体代码
  2. ESP8266-AT指令集
  3. JDK1.8下载、安装和环境配置教程
  4. Unity-世界坐标与屏幕坐标
  5. 什么是封装、继承和多态
  6. 一些在网上搜集的奇奇怪怪的bat代码。。。仅供参考!小心中招!
  7. Ubuntu环境下利用Stress对CPU进行满载及半载压力测试
  8. opencv打开摄像头
  9. python爬虫爬取中国天气网_初识python 之 爬虫:爬取中国天气网数据
  10. Web 实现登录记住密码功能