python爬携程_Pythoncrawler:对携程的航班数据进⾏抓
取,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)。
安卓在线解析jsoncookie过长咱也不会换⾏就这样看吧!其实也可以不传cookie,这⾥本⼈就传了演⽰⼀下
url="ip/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.)["data"]##将json字符串转成字典,并选择data关键字后⾯的值,它还是⼀个字典
5、我们已经得到了⼀个包含6⽉27号深圳到成都的所有航班的字典data,接下来按照我们在⽹页上到数据的步骤,到第⼀个航班的数据:
("routeList")[0].get("legs")[0].get("flight")
##通过关键字⼀步步往下,可以借助刚才在⽹页数据的步骤,或者借助json在线解析⽹站,这⾥不在赘述。
6.到这⾥我们已经得到了包含第⼀个航班信息的字典flight0,接下来当然根据⾃⼰的需要挑选数据了,这⾥简单选择⼏个数据演⽰⼀下:
flight_("flightNumber") ##航班号
plane_("craftTypeName") ##机型
("departureDate") ##出发时间
("arrivalDate") ##到达时间
print(flight_no,'---',plane_type,'---',departuredate,'---',arrivaldate)##打印⼀下
结果:
CZ3621 --- 空客321 --- 2020-06-27 06:30:00 --- 2020-06-27 08:55:00
这⾥是提取的第⼀航班的数据那如果想把深圳-成都所有航班信息输⼊呢,当然是循环就ok:
("routeList") ##获取routeList列表
for num in range(len(datalist)):
flight=datalist[num].get("legs")[0].get("flight")##到航班信息
flight_("flightNumber") ##航班号
plane_("craftTypeName") ##机型
("departureDate") ##出发时间
("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='ip/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": (dcity),
"acity": (acity),
"dcityname":dcity ,
"acityname": acity,
"date": date}]}##这⾥是需要传⼊的参数
response=requests.post(url,headers=headers,data=json.dumps(request_payload))#发送post请求data=json.)['data']
("routeList") ##得到存放所有航班信息的列表
for num in range(len(datalist)):##遍历所有航班
flight=datalist[num].get("legs")[0].get("flight")##到航班信息
flight_("flightNumber") ##航班号
plane_("craftTypeName") ##机型
("departureDate") ##出发时间
("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以上就是爬取携程航班信息的过程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论