假期來臨,酒店房價“水漲船高”

mmz_77發表於2023-04-24

隨著“五一“小長假的臨近,各地旅遊產品進入“衝刺”階段,多地酒店房價也隨之“水漲船高”。

很多網友在網上吐槽,搜尋發現全國各地旅遊城市熱門景點附近的酒店在“五一”假期前3天的價格均較平日高出2-3倍,甚至還有酒店價格上漲5倍,令人直呼“酒店刺客”。

根據一些業內人士的發言來看, 今年五一假期全國酒店價格普遍上漲,可以從供求兩方面來解釋:首先,在供給端,經歷了三年疫情,國內酒店供給大幅減少。其次,今年年初以來國內商務旅行及旅遊度假需求出現了超預期的復甦。與需求端的快速反彈相比,供給端的修復則需要相對較長的週期,而“五一”假期出遊需求集中釋放更加劇了當前供給不足的問題,尤其是熱門旅遊目的地住宿設施供給嚴重不足,價格上漲是必然的。

但是價格的漲幅太大,也讓旅客覺得自己被宰,難”五一“這些酒店的漲幅相比疫情之前是多還是少呢?這裡我們可以透過python爬取歷史資料來對比下。這裡我們就以攜程網上的酒店價格為資料來源。這裡我發現新手在這裡我發現新手在爬取某個網站的時候有個誤區,就是他們覺得爬蟲都是 “通用” 的,一個網站的爬蟲拿過來,網址改一下,再隨便攛吧攛吧就可以爬另一個網站了。

實際上,每一個網站的爬取都是需要單獨進行分析的,你需要找到目標資料是在網頁上的什麼位置,是透過靜態還是動態的方式載入進去的,網站是否有難搞的反爬蟲措施,等等,從而來制定自己爬蟲的爬取策略。像攜程爬取的資料多了就會觸碰封ip的反爬機制,這種情況下我們只有透過新增優質動態ip池來解決,這裡我們就可以使用 python透過Keep-Alive保持IP不變,向多個頁面發出請求,透過多執行緒實現併發控制然後獲取資料,ip的選擇的由億牛雲提供的爬蟲加強版ip池,實現過程如下:

#! -*- encoding:utf-8 -*-
import requests
import random
import requests.adapters
import threading # 匯入threading模組
import time # 匯入time模組
# 要訪問的目標頁面
targetUrlList = [
    "
    "
    "
]
# 代理伺服器(產品官網 )
proxyHost = "t.16yun.cn"
proxyPort = "31111"
# 代理驗證資訊
proxyUser = "SFEDEWE"
proxyPass = "785878"
proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
# 設定 http和https訪問都是用HTTP代理
proxies = {
    "http": proxyMeta,
    "https": proxyMeta,
}
# 定義一個全域性變數,用於記錄上一次請求的時間
last_request_time = 0
# 定義一個全域性變數,用於建立一個執行緒鎖
lock = threading.Lock()
# 定義一個函式,用於訪問一個目標網址
def visit_url(url, i):
    global last_request_time # 宣告全域性變數
    with requests.session() as s: # 使用with語句管理會話
        with lock: # 使用執行緒鎖
            # 獲取當前時間
            current_time = time.time()
            # 計算距離上一次請求的時間差
            delta_time = current_time - last_request_time
            # 如果時間差小於200毫秒,就等待一段時間
            if delta_time < 0.2:
                time.sleep(0.2 - delta_time)
            # 更新上一次請求的時間
            last_request_time = time.time()
        # 傳送請求
        r = s.get(url, proxies=proxies)
        print(f"第{i+1}個網址,結果如下:") # 使用f-string格式化輸出
        print(r.text)
# 建立一個空的執行緒列表
threads = []
for i, url in enumerate(targetUrlList): # 使用enumerate函式遍歷列表
    # 建立一個執行緒,傳入目標網址和索引
    t = threading.Thread(target=visit_url, args=(url, i))
    # 將執行緒新增到執行緒列表
    threads.append(t)
    # 啟動執行緒
    t.start()
# 等待所有執行緒結束
for t in threads:
    t.join()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31522063/viewspace-2948433/,如需轉載,請註明出處,否則將追究法律責任。

相關文章