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
以上就是爬取携程航班信息的过程。