python爬携程_Python crawler:对携程的航班数据进行抓取,python,爬虫,爬取
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,爬虫,爬取相关推荐
- python从网址爬图片协程_python 用 gevent 协程抓取海量网页
python作为爬虫利器,抓网页的方式简洁明了.爬成百上千的网页,都可以很快爬完,但是如果网页数量上万呢?速度就不能忍受了. 这是一段爬取页面的函数,用了requests库:1 2 3 4 5impo ...
- python网络编程库_Python网络编程——协程
协程的概念 协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字 ...
- python均线选股_python选股模型均线,已知股票数据,如何用Python绘制k线日对应数据...
Q1:已知股票数据,如何用Python绘制k线日对应数据 我没遇到过 只是自己写过 有点经验 先确定时间片 然后再把tick插入就行了 Q2:使用python实现ema(指数移动平均的计算) a = ...
- python爬虫获取的网页数据为什么要加[0-python3爬虫爬取网页思路及常见问题(原创)...
学习爬虫有一段时间了,对遇到的一些问题进行一下总结. 爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save). 下面分别说下这几个过程中可以 ...
- python java 爬数据_如何用java爬虫爬取网页上的数据
当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...
- python有什么优点_Python是什么?有什么优点?赶紧来看看Python的入门教程
Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结 ...
- 数据收集-抓包与反爬
抓包与反爬 常见的反爬手段 反爬原因 反爬常见概念 反爬的三个方向 基于身份识别进行反爬 通过headers字段来反爬 通过请求参数来反爬 常见基于爬虫行为进行反爬 基于请求频率或总请求数量 根据爬取 ...
- python2协程_python中的协程(二)
协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他 ...
- python入门教程收藏_python入门教程:超详细保你1小时学会Python,快来收藏看看...
简介:简介(转发文章+私信[Python]获取资料方式)1.Hello world安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行 ...
- python显示控制台行情_python命令行查看股票基本行情数据
写了一个Python版本的小工具,可以在上班的时候刷一下你关注的股票信息.Python版本用的是3.4.1的,代码如下: #!/usr/bin/env python # -*- coding:utf- ...
最新文章
- KDE Applications 19.04 发布,包含大量更新
- JAM - how count is got - SAP Fiori和JAM的集成
- lombok进行有参无参构造出现的问题
- H3C 三种生成树协议特性的比较
- 腾讯微博Android客户端开发——自动获取验证码
- mysql报错last packet_mysql The last packet successfully received
- JVM(六)为什么新生代有两个Survivor分区? 1
- 解决Firefox访问EBS时提示激活Java插件的问题
- 无锁数据结构--理解CAS、ABA、环形数组
- 堆栈应用(三):火车车厢重排
- win10使用navicat管理数据库
- Python全栈(四)高级编程技巧之4.元类编程、迭代器和生成器
- 不同浏览器中手动启用Flash Player
- select标签如何设置默认选中的选项
- idea快速切换不同JDK版本
- 轻量化安装 TKEStack:让已有 K8s 集群拥有企业级容器云平台的能力
- Python学习之字典练习(重复数字统计)
- JavaScript知识点整理(十六)- PC端网页特效 - 案例练习
- 中国图形图象学报和计算机科学,lbrack;中国图象图形学报rsqb;参考文献格式
- Rogue Signs: Deceiving Traffic Sign Recognition with Malicious Ads and Logos