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
from fake_useragent import UserAgent
import json
2、下面准备,头部信息(headers)和参数(request_payload)。cookie过长咱也不会换行就这样看吧!其实也可以不传cookie,这里本人就传了演示一下
url="https://flights.ctrip.com/itinerary/api/12808/products"
headers={
'User-Agent':UserAgent().chrome,
"Content-Type": "application/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))
4、将得到的响应文本转成json对应的python格式*(这里是字典)*
data=json.loads(response.text)["data"]
5、我们已经得到了一个包含6月27号深圳到成都的所有航班的字典data,接下来按照我们在网页上找到数据的步骤,找到第一个航班的数据:
flight0=data.get("routeList")[0].get("legs")[0].get("flight")
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")
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
如果想提取不同始发地到目的地不同日期的航班信息呢,那就将前面的过程封装成一个方法,向里面传参就可以了,话不多说上代码:
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))
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(使用前将#替换为@)