Python爬取携程机票代码实例

本文介绍了使用Python模拟调用携程机票接口的过程,详细讲述了如何处理动态变化的token问题,以及在解决过程中遇到的挑战。代码示例展示了如何获取和使用城市编码,但遇到了即使多次调用接口也无法更新token的难题,期待读者提供解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python爬取携程机票代码实例

现在携程的页面是通过接口传递数据的,不能直接使用xpath进行解析,需要模拟调用接口的步骤
dcity是指出发地的城市编码
acity是指目的地的城市编码
其他参数是根据前端页面直接复制过来的,Mac 的Chrome浏览器如下图
在这里插入图片描述

def getResponse(fromCity,toCity,date):
    cityInfo = judgeCity(fromCity,toCity,date)
    dcity = cityInfo.get('dcity')
    dcityName = cityInfo.get('dcityName')
    acity = cityInfo.get('acity')
    acityName = cityInfo.get('acityName')
    token = getToken(fromCity,toCity,date)
    url = "https://flights.ctrip.com/itinerary/api/12808/products"
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36",
        "Referer": "https://flights.ctrip.com/itinerary/oneway/"+dcity+"-"+acity+"?date="+date,
        "Content-Type": "application/json"}
    request_payload = {
        "flightWay": "Oneway",
        "classType": "ALL",
        "hasChild": False,
        "hasBaby": False,
        "searchIndex": 1,
        "airportParams": [
            {
  "dcity": dcity, "acity": acity, "dcityname": dcityName, "acityname": acityName, "date": date}],
        "token": token
    }

    # post请求
    response = requests.post(url, data=json.dumps(request_payload), headers=headers).text

    return response

返回的结果可以在下图中找到具体字段,进行json字段的解析
在这里插入图片描述

def parseInfo(fromCity,toCity,date):

    airplaneInfo = {}

    response = getResponse(fromCity,toCity,date)
    print(response)
    # 很多航班信息在此分一下
    routeList = json.loads(response).get('data').get('routeList')
    # print(routeList)
    # 依次读取每条信息
    for route in routeList:
        # 判断是否有信息,有时候没有会报错
        if len(route.get('legs')) == 1:
            legs = route.get('legs')
            flight = legs[0].get('flight')
            # 提取想要的信息
            airlineName = flight.get('airlineName')  # 航空公司
            flightNumber = flight.get('flightNumber')  # 航班编号
            departureDate = flight.get('departureDate')  # 出发时间
            arrivalDate = flight.get('arrivalDate')  # 到达时间
            craftTypeName = flight.get('craftTypeName')  # 飞机类型
            craftTypeKindDisplayName = flight.get('craftTypeKindDisplayName')  # 飞机型号:大型;中型,小型

            departureCityName = flight.get('departureAirportInfo').get('cityName')  # 出发城市
            departureAirportName = flight.get('departureAirportInfo').get('airportName')  # 出发机场名称
            departureTerminalName = flight.get('departureAirportInfo').get('terminal').get('name')  # 出发机场航站楼
            arrivalCityName = flight.get('arrivalAirportInfo').get('cityName')  # 到达城市
            arrivalAirportName = flight.get('arrivalAirportInfo').get('airportName')  # 到达机场名称
            arrivalTerminalName = flight.get('arrivalAirportInfo').get('terminal').get('name')  # 到达机场航站楼

            punctualityRate = flight.get('punctualityRate')  # 到达准点率
            mealType = flight.get('mealType')  # 是否有餐食  None:代表无餐食,Snack:代表小食,Meal:代表含餐食

            cabins = legs[0].get('cabins')
            price = cabins[0].get('price').get('price')  # 标准价格
            rate = cabins[0].get('price').get('rate')  # 折扣率
            seatCount = cabins[0].get('seatCount')  # 剩余座位数

遇到的问题,是token的问题,在输入出发地和目的地时,发现token会改变,然后我尝试着去获取到token,找到了一个获取token的接口,如下图:
在这里插入图片描述

def getTokenResponse(fromCity,toCity,date):
    cityInfo = judgeCity(fromCity,toCity,date)
    dcity = cityInfo.get('dcity')
    dcityname = cityInfo.get('dcityname')
    acity = cityInfo.get('acity')
    acityname = cityInfo.get('acityname')
    referer = "https://flights.ctrip.com/itinerary/oneway/" + dcity + "-" + acity + "?date=" + date
    url = "https://flights.ctrip.com/itinerary/api/12808/records"
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36",
        "Referer": referer,
        "Content-Type": "application/json"}
    request_payload = {
        "vid": "1586849490183.3km93i"
    }
    print(referer)
    # post请求
    response = requests
### 实现携程旅游景点信息的网络爬虫 为了实现对携程旅游景点信息的有效抓取,可以采用`Selenium`库配合浏览器自动化技术完成这一目标。对于Edge浏览器而言,需先安装对应版本的WebDriver,并通过Python脚本控制其访问指定URL,进而提取所需数据[^1]。 ```python from selenium import webdriver from selenium.webdriver.edge.options import Options as EdgeOptions import time # 设置Edge选项 edge_options = EdgeOptions() edge_options.add_argument('headless') # 启动无头模式 edge_options.add_argument('disable-gpu') edge_options.add_argument("window-size=1920,1080") # 创建Edge WebDriver实例 driver_path = 'path_to_edge_driver' # 替换为实际路径 driver = webdriver.Edge(executable_path=driver_path,options=edge_options) # 访问目标网站 target_url = "https://you.ctrip.com/sight/jingdezhen405/61145.html" driver.get(target_url) time.sleep(3) # 等待页面加载完毕 ``` 当成功打开网页后,通常还需要执行一些交互动作以触发动态内容加载,比如模拟滚动条向下拉动的操作来加载更多评论: ```python def scroll_down(driver): last_height = driver.execute_script("return document.body.scrollHeight") while True: # 下滑到底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载出来 time.sleep(2) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height scroll_down(driver) ``` 最后一步是从HTML文档中解析出有用的信息片段,这可能涉及到XPath表达式的选择或是CSS选择器的应用。考虑到不同类型的元素定位方法各有优劣,在此提供一种基于BeautifulSoup库的方式处理已下载下来的静态HTML源码: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(driver.page_source,'html.parser') comments_section = soup.find_all(attrs={"class": "comment"}) # 假设评论区有特定属性标识 for comment in comments_section: print(comment.text.strip()) ``` 以上代码展示了如何利用Python编写一个简单的Web Scraper用于收集来自携程旅行网上的景点评价资料。值得注意的是,由于反爬机制的存在以及法律风险考量,建议开发者遵循各平台的服务条款合理合法地开展此类活动[^2]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值