每到放假出遊的時候,規劃行程就是最花時間的工作,要到許多網站蒐集各種旅遊景點,而這也是Python網頁爬蟲很常應用的情境,透過自動化的方式有效蒐集熱門的旅遊景點資料,提升規劃行程的效率。這篇文章就用雄獅旅遊網站來當作網路爬蟲應用實例,教大家使用Python網頁爬蟲蒐集旅遊資料。
- 網站分析及爬取策略
- Python網頁爬蟲爬取JavaScript網站資料
- Python網頁爬蟲爬取多分頁資料
一、網站分析及爬取策略
首先,前往雄獅旅遊網站,如下圖:
截取自雄獅旅遊
假設我們想要利用Python網頁爬蟲蒐集韓國旅行團的資料,在上面「國外團體」的地方選擇「韓國」,如下圖:
截取自雄獅旅遊
並且在下面「季節限定」的區塊選擇「更多行程」,如下圖:
截取自雄獅旅遊
就可以看到非常多季節限定的旅行團資料,如下圖:
截取自雄獅旅遊
這時候點擊滑鼠右鍵,選擇「檢查」,切換到「Network(網路)」頁籤,來檢視網頁背後發送請求的況況。
接下來,按下「Ctrl + R」重新整理網頁,並且搜尋網頁上的資料,會發現網站有使用JavaScript發送請求來取得資料,如下圖:
由此可知,這個網頁就是JavaScript型網頁,那要利用Python網頁爬蟲爬取JavaScript型網頁的資料,我們就需要知道它的請求網址(Url)、請求方法(Request Method)及請求參數(Payload),可以切換到Headers(標頭)、Payload(參數)頁籤檢視,如下圖:
如果想要瞭解更詳細的Python網頁爬蟲爬取策略,可以參加我的免費線上培訓,教你各種網頁的爬取方法,讓你能夠輕鬆判斷網頁類型,爬取到想要的資料。
二、Python網頁爬蟲爬取JavaScript網站資料
Python網頁爬蟲爬取JavaScript網站回應的資料,需要引用requests模組,如下範例:
import requests
接著,利用requests模組發送POST請求到JavaScript的請求網址,如下範例:
import requests response = requests.post('https://travel.liontravel.com/search/grouplistinfojson')
由於剛剛有看到網頁發送請求的時候有傳入參數(Payload),所以Python網頁爬蟲中也要將參數夾帶在請求中,如下範例:
import requests payload = { # "ArriveID":null, "GoDatestart": "2024-07-20", # "GroupID":null, # "Keywords":null, # "IsEnsureGroup":null, # "IsSold":null, # "ThemeID":null, "TravelPavilionGroupID": "14NN", # "KeywordsCity":null, "TravelType": 0, "BuIDs": "", # "PreferAirlines":null, "GoDateEnd": "2027-07-20", "DepartureID": "", "WeekDay": "", # "PriceList":null, "AirlineIDs": "", "TripTypes": "", "Tags": "", "Days": "", "Page": 1, "PageSize": 10 } response = requests.post( 'https://travel.liontravel.com/search/grouplistinfojson', data=payload)
PS.將Payload參數值為null的參數移除或註解。
Python網頁爬蟲發送請求之後,就可以呼叫Python內建的json()函式解析回應的JSON格式資料,並且存取我們想要爬取的「NormGroupList」欄位,如下範例:
import requests payload = { # "ArriveID":null, "GoDatestart": "2024-07-20", # "GroupID":null, # "Keywords":null, # "IsEnsureGroup":null, # "IsSold":null, # "ThemeID":null, "TravelPavilionGroupID": "14NN", # "KeywordsCity":null, "TravelType": 0, "BuIDs": "", # "PreferAirlines":null, "GoDateEnd": "2027-07-20", "DepartureID": "", "WeekDay": "", # "PriceList":null, "AirlineIDs": "", "TripTypes": "", "Tags": "", "Days": "", "Page": 1, "PageSize": 10 } response = requests.post( 'https://travel.liontravel.com/search/grouplistinfojson', data=payload) groupLists = response.json()['NormGroupList']
利用For迴圈讀取其中多筆的旅行團資料,並且爬取TourName(旅行團名稱)、GroupStraightPrice(旅行團價格)資料,如下範例:
import requests payload = { # "ArriveID":null, "GoDatestart": "2024-07-20", # "GroupID":null, # "Keywords":null, # "IsEnsureGroup":null, # "IsSold":null, # "ThemeID":null, "TravelPavilionGroupID": "14NN", # "KeywordsCity":null, "TravelType": 0, "BuIDs": "", # "PreferAirlines":null, "GoDateEnd": "2027-07-20", "DepartureID": "", "WeekDay": "", # "PriceList":null, "AirlineIDs": "", "TripTypes": "", "Tags": "", "Days": "", "Page": 1, "PageSize": 10 } response = requests.post( 'https://travel.liontravel.com/search/grouplistinfojson', data=payload) groupLists = response.json()['NormGroupList'] for groupList in groupLists: print((groupList['TourName'], groupList['GroupStraightPrice']))
('釜山慶州大邱賞楓旅遊|八公山纜車.紅流洞溪谷.森林研究所.金井山.海雲台列車五日(一站購物彩妝)', '21,900') ('首爾旅遊|升等一晚明洞鬧區.雪嶽山.千年古剎月精寺.首爾天空公園.穿韓服遊景福宮五日|賞楓賞芒草.波波草', '22,500') ('釜山賞楓旅遊|順天國家庭園.黃金蘆葦.步步驚心位良池.密陽嶺南樓.金井山楓葉.海雲台膠囊列車五日(一站購物彩妝)', '22,900') ('賞楓賞銀杏|首爾旅遊|升等二晚近明洞飯店.內藏山_雞龍山國立公園.穿韓服.嚐韓食.逛弘大五日', '23,500') ('慢遊首爾半自助|賞楓賞銀杏|紅葉與金黃《南怡島+江村鐵道自行車》.一日自由活動.連住近明洞飯店兩晚(一站彩妝購物)五日', '24,900')
三、Python網頁爬蟲爬取多分頁資料
那如果想要利用Python網頁爬蟲想要爬取第2頁的旅行團資料,該怎麼實作呢?
其實在Payload參數中,有Page頁碼參數,我們只要用For迴圈動態傳入頁碼,Python網頁爬蟲就可以爬取多分頁的網頁資料了,如下範例第4、27行:
import requests for page in range(1, 3): #執行1~2 payload = { # "ArriveID":null, "GoDatestart": "2024-07-20", # "GroupID":null, # "Keywords":null, # "IsEnsureGroup":null, # "IsSold":null, # "ThemeID":null, "TravelPavilionGroupID": "14NN", # "KeywordsCity":null, "TravelType": 0, "BuIDs": "", # "PreferAirlines":null, "GoDateEnd": "2027-07-20", "DepartureID": "", "WeekDay": "", # "PriceList":null, "AirlineIDs": "", "TripTypes": "", "Tags": "", "Days": "", "Page": page, "PageSize": 10 } response = requests.post( 'https://travel.liontravel.com/search/grouplistinfojson', data=payload) groupLists = response.json()['NormGroupList'] for groupList in groupLists: print((groupList['TourName'], groupList['GroupStraightPrice']))
最後,我們可以定義一個串列(List),將Python網頁爬蟲爬取到的多分頁資料打封裝起來,如下範例第4、39行:
import requests result = list() for page in range(1, 3): #執行1~2 payload = { # "ArriveID":null, "GoDatestart": "2024-07-20", # "GroupID":null, # "Keywords":null, # "IsEnsureGroup":null, # "IsSold":null, # "ThemeID":null, "TravelPavilionGroupID": "14NN", # "KeywordsCity":null, "TravelType": 0, "BuIDs": "", # "PreferAirlines":null, "GoDateEnd": "2027-07-20", "DepartureID": "", "WeekDay": "", # "PriceList":null, "AirlineIDs": "", "TripTypes": "", "Tags": "", "Days": "", "Page": page, "PageSize": 10 } response = requests.post( 'https://travel.liontravel.com/search/grouplistinfojson', data=payload) groupLists = response.json()['NormGroupList'] for groupList in groupLists: result.append((groupList['TourName'], groupList['GroupStraightPrice'])) print(result)
執行結果
[ ('釜山慶州大邱賞楓旅遊|八公山纜車.紅流洞溪谷.森林研究所.金井山.海雲台列車五日(一站購物彩妝)', '21,900'), ('首爾旅遊|升等一晚明洞鬧區.雪嶽山.千年古剎月精寺.首爾天空公園.穿韓服遊景福宮五日|賞楓賞芒草.波波草', '22,500'), ('釜山賞楓旅遊|順天國家庭園.黃金蘆葦.步步驚心位良池.密陽嶺南樓.金井山楓葉.海雲台膠囊列車五日(一站購物彩妝)', '22,900'), ('賞楓賞銀杏|首爾旅遊|升等二晚近明洞飯店.內藏山_雞龍山國立公園.穿韓服.嚐韓食.逛弘大五日', '23,500'), ('慢遊首爾半自助|賞楓賞銀杏|紅葉與金黃《南怡島+江村鐵道自行車》.一日自由活動.連住近明洞飯店兩晚(一站彩妝購物)五日', '24,900'), ... ('釜山國際煙火節|賞楓仙境~慶州吐含池.銀杏大道~統一殿.【世界文化遺產】佛國寺.釜山最夯~海理團路(一站彩妝)五日', '21,900'), ('首爾旅遊|韓楓古城~南漢山城.江華千年古剎.天空公園粉紅波波草.五星渡假村(一站彩妝)五日', '22,900'), ('釜山國際煙火節|八公山賞楓.慶州吐含池.銀杏大道.海里團路好好逛(一站購物彩妝)五日', '23,900') ]
四、小結
以上就是Python網頁爬蟲應用在旅遊網站的開發範例,如果想爬取每個旅行團更詳細的行程資料,可以參考一篇看完就懂Python網頁爬蟲爬取JavaScript網頁資料的實作文章,能夠省下人工到各個網站蒐集景點資料的時間,有效比較多種不同旅行團的行程與價格,選擇到高CP值的行程。
除此之外,本文也藉此機會來分享Python網頁爬蟲爬取JavaScript型網站的最佳實作,希望對大家有所幫助,歡迎分享給身邊在學習網頁爬蟲的朋友,並且在下方訂閱本站,每週學習實用的Python應用教學。
留言
張貼留言