基于Python的攜程國際機票價格抓取與分析

一、項目背景與目標

攜程作為中國領先的在線旅行服務平臺,提供了豐富的機票預訂服務。其國際機票價格受多種因素影響,包括季節、節假日、航班時刻等。通過抓取攜程國際機票價格數據,我們可以進行價格趨勢分析、性價比評估以及旅行規劃建議等。

本項目的目標是:

  1. 利用Python爬蟲技術抓取攜程國際機票價格數據。
  2. 對抓取的數據進行清洗和存儲。
  3. 進行數據分析,包括價格趨勢、熱門航線等。
  4. 提供可視化結果,幫助用戶直觀了解機票價格動態。

二、 爬蟲實現步驟

1 目標分析

攜程國際機票頁面(如 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">flights.ctrip.com</font>**)通常采用動態加載,數據可能通過AJAX請求返回JSON格式。我們需要:

  1. 分析網頁請求:使用瀏覽器開發者工具(F12)查看XHR請求。
  2. 模擬請求:構造合理的請求頭(Headers)和參數(Params)。
  3. 解析數據:提取航班號、出發/到達時間、航空公司、價格等信息。

2 代碼實現

(1) 安裝依賴
(2) 獲取機票數據(靜態頁面方案)

如果攜程的機票數據可以直接通過HTML獲取(部分舊版頁面適用),可以使用 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests + Beautifu</font>**

import requests
from bs4 import BeautifulSoup
import pandas as pddef scrape_ctrip_flights(departure, arrival, date):url = f"https://flights.ctrip.com/international/{departure}-{arrival}?depdate={date}"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'html.parser')flights = []for flight in soup.select('.flight-item'):airline = flight.select_one('.airline-name').text.strip()departure_time = flight.select_one('.depart-time').text.strip()arrival_time = flight.select_one('.arrival-time').text.strip()price = flight.select_one('.price').text.strip()flights.append({'Airline': airline,'DepartureTime': departure_time,'ArrivalTime': arrival_time,'Price': price})return pd.DataFrame(flights)# 示例:抓取上海到東京的2023-12-01航班
df = scrape_ctrip_flights('SHA', 'TYO', '2023-12-01')
print(df.head())
(3) 動態頁面抓取(Selenium方案)

如果數據是動態加載的,需使用 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Selenium</font>** 模擬瀏覽器操作:

from selenium import webdriver
from selenium.webdriver.common.by import By
import timedef scrape_ctrip_dynamic(departure, arrival, date):driver = webdriver.Chrome()  # 需安裝ChromeDriverurl = f"https://flights.ctrip.com/international/{departure}-{arrival}?depdate={date}"driver.get(url)time.sleep(5)  # 等待頁面加載flights = []for flight in driver.find_elements(By.CSS_SELECTOR, '.flight-item'):airline = flight.find_element(By.CSS_SELECTOR, '.airline-name').textdeparture_time = flight.find_element(By.CSS_SELECTOR, '.depart-time').textarrival_time = flight.find_element(By.CSS_SELECTOR, '.arrival-time').textprice = flight.find_element(By.CSS_SELECTOR, '.price').textflights.append({'Airline': airline,'DepartureTime': departure_time,'ArrivalTime': arrival_time,'Price': price})driver.quit()return pd.DataFrame(flights)# 示例:動態抓取數據
df = scrape_ctrip_dynamic('SHA', 'TYO', '2023-12-01')
print(df.head())
(4) 反爬策略

攜程可能有反爬機制,需采取以下措施:

  • 隨機User-Agent:避免被識別為爬蟲。
  • IP代理池:防止IP被封禁。
  • 請求間隔:避免高頻訪問。

示例(使用 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">fake_useragent</font>** 和代理):

from fake_useragent import UserAgent
import requests# 初始化UserAgent對象
ua = UserAgent()# 設置請求頭
headers = {"User-Agent": ua.random,"Accept-Language": "en-US,en;q=0.9"
}# 設置代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 構造代理服務器的認證信息
proxy_auth = f"{proxyUser}:{proxyPass}"# 構造代理服務器的URL
proxies = {"http": f"http://{proxy_auth}@{proxyHost}:{proxyPort}","https": f"https://{proxy_auth}@{proxyHost}:{proxyPort}"
}# 目標URL
url = "https://example.com"  # 替換為你的目標URL# 發送請求
response = requests.get(url, headers=headers, proxies=proxies)# 打印響應內容
print(response.text)

三、 數據分析與可視化

(1) 數據清洗

# 轉換價格格式(如 "¥2,500" → 2500)
df['Price'] = df['Price'].str.replace('¥', '').str.replace(',', '').astype(float)# 按價格排序
df_sorted = df.sort_values('Price')
print(df_sorted.head())

(2) 價格分布可視化

import matplotlib.pyplot as plt
import seaborn as snsplt.figure(figsize=(10, 6))
sns.histplot(df['Price'], bins=20, kde=True)
plt.title('International Flight Price Distribution (Shanghai to Tokyo)')
plt.xlabel('Price (¥)')
plt.ylabel('Frequency')
plt.show()

(3) 航空公司價格對比

plt.figure(figsize=(12, 6))
sns.boxplot(x='Airline', y='Price', data=df)
plt.xticks(rotation=45)
plt.title('Flight Price Comparison by Airline')
plt.show()

四.、結論

本文介紹了如何使用Python爬取攜程國際機票數據,并進行分析與可視化。關鍵點包括:

  1. 網頁分析:確定數據加載方式(靜態/動態)。
  2. 爬蟲實現:使用 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Requests</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Selenium</font>** 抓取數據。
  3. 反爬策略:合理設置請求頭、代理和訪問頻率。
  4. 數據分析:利用 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Pandas</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Matplotlib</font>** 進行價格趨勢分析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903370.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows 圖形顯示驅動開發-初始化WDDM 1.2 和 PnP

(WDDM) 1.2 及更高版本顯示微型端口驅動程序的所有 Windows 顯示驅動程序都必須支持以下行為&#xff0c;以響應即插即用 (PnP) 基礎結構啟動和停止請求。 根據驅動程序返回成功或失敗代碼&#xff0c;或者系統硬件是基于基本輸入/輸出系統 (BIOS) 還是統一可擴展固件接口 (UEF…

【1區SCI】Fusion entropy融合熵,多尺度,復合多尺度、時移多尺度、層次 + 故障識別、診斷-matlab代碼

引言 2024年9月&#xff0c;研究者在數學領域國際頂級SCI期刊《Chaos, Solitons & Fractals》&#xff08;JCR 1區&#xff0c;中科院1區 Top&#xff09;上以“Fusion entropy and its spatial post-multiscale version: Methodology and application”為題發表最新科學研…

高并發架構設計之緩存

一、引言 緩存技術作為高并發架構設計的基石之一&#xff0c;通過數據暫存和快速訪問機制&#xff0c;在提升系統性能、降低后端負載方面發揮著不可替代的作用。優秀的緩存設計能夠將系統吞吐量提升數個數量級&#xff0c;將響應時間從秒級降至毫秒級&#xff0c;甚至成為系統…

Unity AI-使用Ollama本地大語言模型運行框架運行本地Deepseek等模型實現聊天對話(一)

一、Ollama介紹 官方網頁&#xff1a;Ollama官方網址 中文文檔參考&#xff1a;Ollama中文文檔 相關教程&#xff1a;Ollama教程 Ollama 是一個開源的工具&#xff0c;旨在簡化大型語言模型&#xff08;LLM&#xff09;在本地計算機上的運行和管理。它允許用戶無需復雜的配置…

Docker Python 鏡像使用指南

1. 使用 Python 鏡像創建容器 docker run -itd -v /data:/data python:latest 作用&#xff1a;創建一個基于 python:latest 鏡像的容器&#xff0c;并后臺運行。 參數說明&#xff1a; -itd&#xff1a;交互式后臺運行&#xff08;-i 交互模式&#xff0c;-t 分配偽終端&…

matlab中Simscape的調用-入門

Simscape 是由 MathWorks 公司開發的一款基于物理建模的仿真工具&#xff0c;它建立在 MATLAB/Simulink 平臺之上&#xff0c;專門用于建模和仿真多領域物理系統。 主要特點 多領域建模&#xff1a;Simscape 提供了豐富的物理元件庫&#xff0c;涵蓋了機械、電氣、液壓、氣動…

Flowable7.x學習筆記(十三)查看部署流程圖

前言 Flowable 的流程圖是 Flowable Modeler 或 Process Editor 中&#xff0c;使用拖拽和屬性面板基于 BPMN 2.0 元素&#xff08;如任務、網關、事件、序列流等&#xff09;渲染出的業務流程圖形界面?。 一、將圖形導出可查看的作用 ① 可視化建模 幫助業務分析師和開發者…

Bootstrap 模態框

Bootstrap 模態框 Bootstrap 模態框&#xff08;Modal&#xff09;是 Bootstrap 框架中的一個組件&#xff0c;它允許你在一個頁面中創建一個模態對話框&#xff0c;用于顯示內容、表單、圖像或其他信息。模態框通常覆蓋在當前頁面上&#xff0c;提供了一種不離開當前頁面的交…

python-69-基于graphviz可視化軟件生成流程圖

文章目錄 1 Graphviz可視化軟件1.1 graphviz簡介1.2 安裝部署2 基于python示例應用2.1 基本示例2.2 解決中文顯示亂碼2.3 顯示多個輸出邊2.4 顯示輸出引腳名稱2.5 從左至右顯示布局2.6 設置節點為方形3 參考附錄1 Graphviz可視化軟件 1.1 graphviz簡介 Graphviz(Graph Visua…

AJAX 介紹

一、什么是AJAX ? AJAX 是 異步的 JavaScript 和 XML&#xff08;Asynchronous JavaScript And XML&#xff09; 的縮寫&#xff0c;是一種實現瀏覽器與服務器進行數據通信的技術。其核心是通過 XMLHttpRequest 對象在不重新刷新頁面的前提下&#xff0c;與服務器交換數據并更…

新ubuntu物理機開啟ipv6讓外網訪問

Ubuntu 物理機 SSH 遠程連接與 IPv6 外網訪問測試指南 1. 通過 SSH 遠程連接 Ubuntu 物理機 1.1 安裝 SSH 服務 sudo apt update sudo apt install openssh-server1.2 檢查 SSH 服務狀態 sudo systemctl status ssh確認出現 active (running)。 1.3 獲取物理機 IP 地址 i…

linux系統上使用nginx訪問php文件返回File not found錯誤處理方案

linux系統上使用nginx訪問php文件返回File not found錯誤處理方案 第一種情況第二種情況 第一種情況 可以在你的location php 里面添加當文件不存在時返回404而不是交給php-fpm進行處理 location ~ \.php$ { ... #文件不存在轉404 try_files $uri 404; ... }然后&#xff0c…

基于 SpringBoot 與 Redis 的緩存預熱案例

文章目錄 “緩存預熱” 是什么&#xff1f;項目環境搭建創建數據訪問層預熱數據到 Redis 中創建緩存服務類測試緩存預熱 “緩存預熱” 是什么&#xff1f; 緩存預熱是一種優化策略&#xff0c;在系統啟動或者流量高峰來臨之前&#xff0c;將一些經常訪問的數據提前加載到緩存中…

java—11 Redis

目錄 一、Redis概述 二、Redis類型及編碼 三、Redis對象的編碼 1. 類型&編碼的對應關系 2. string類型常用命令 &#xff08;1&#xff09;string類型內部實現——int編碼 &#xff08;2&#xff09;string類型內部實現——embstr編碼 ?編輯 &#xff08;3&#x…

分布式鏈路追蹤理論

基本概念 分布式調用鏈標準-openTracing Span-節點組成跟蹤樹結構 有一些特定的變量&#xff0c;SpanName SpanId traceId spanParentId Trace&#xff08;追蹤&#xff09;&#xff1a;代表一個完整的請求流程&#xff08;如用戶下單&#xff09;&#xff0c;由多個Span組成…

err: Error: Request failed with status code 400

好的&#xff0c;今天學習ai的時候從前端發送請求&#xff0c;實在是想不通為啥會啥是一個壞請求&#xff0c;后來從前端方法一個一個找參數&#xff0c;傳遞的值都有&#xff0c;然后想到我這邊需要傳遞的是一個對象&#xff0c;那么后端使用的RequestParam就接收不到json對象…

開發小程序后端用PHP好還是Java哪個好?

在開發后端時&#xff0c;是選擇PHP還是Java主要取決于你的項目需求、團隊技術棧、性能要求以及維護成本等因素。下面我將從幾個關鍵方面對兩者進行簡要對比&#xff0c;以幫助你做出更明智的選擇。 PHP 優點&#xff1a; 簡單易學&#xff1a;PHP語法簡單&#xff0c;上手快&a…

麒麟V10 aarch64 qt 安裝

在麒麟V10(aarch64架構)中安裝Qt,需根據具體需求選擇合適的方法。以下是綜合多個搜索結果的安裝方案及注意事項: 一、安裝方法 1. 在線安裝默認版本 適用于對Qt版本無特殊要求的情況。通過APT包管理器安裝系統默認提供的Qt版本(如Qt 5.12.12): sudo apt-get update s…

pdf.js移動端預覽PDF文件時,支持雙指縮放

在viewer.html中添加手勢縮放代碼 <script>// alert("Hello World");let agent navigator.userAgent.toLowerCase();// if (!agent.includes("iphone")) {let pinchZoomEnabled false;function enablePinchZoom(pdfViewer) {let startX 0, start…

算法筆記.kruskal算法求最小生成樹

題目&#xff1a;&#xff08;來源&#xff1a;AcWing&#xff09; 給定一個 n 個點 m 條邊的無向圖&#xff0c;圖中可能存在重邊和自環&#xff0c;邊權可能為負數。 求最小生成樹的樹邊權重之和&#xff0c;如果最小生成樹不存在則輸出 impossible。 給定一張邊帶權的無向…