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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python有很多GUI库可以用来设计爬虫界面,比如Tkinter、PyQt、wxPython等等。这里以Tkinter为例,介绍如何设计一个带图形界面的爬虫。 首先,需要安装Tkinter库。在Python 3中,Tkinter是内置的,不需要额外安装。如果你使用的是Python 2.x版本,需要安装Tkinter库。 接下来,我们来设计一个简单的爬虫界面。界面上有一个输入框,用来输入要爬取的网站的URL,还有一个“开始爬取”按钮,点击后会开始爬取指定的网站。 下面是一个简单的代码示例: ```python import tkinter as tk import requests from bs4 import BeautifulSoup class CrawlerGUI: def __init__(self, master): self.master = master master.title("爬虫") self.label = tk.Label(master, text="请输入要爬取的网站URL:") self.label.pack() self.url_entry = tk.Entry(master) self.url_entry.pack() self.start_button = tk.Button(master, text="开始爬取", command=self.start_crawl) self.start_button.pack() def start_crawl(self): url = self.url_entry.get() response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 在这里写爬虫代码 root = tk.Tk() crawler_gui = CrawlerGUI(root) root.mainloop() ``` 在这个示例中,我们首先导入了tkinter、requests和BeautifulSoup库。然后,我们定义了一个CrawlerGUI类,该类包含了GUI界面的所有组件,包括标签、输入框和按钮。当用户点击“开始爬取”按钮时,会调用start_crawl()方法,该方法会从输入框中获取URL,然后使用requests库发起HTTP请求,获取网站的HTML内容。最后,使用BeautifulSoup库解析HTML内容,你可以在这里编写你的爬虫代码。 最后,我们创建一个Tkinter窗口,并实例化CrawlerGUI类,然后调用mainloop()方法来显示窗口。这样,我们就完成了一个简单的爬虫GUI界面的设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值