解決Python爬蟲中文網址問題!(KKday多頁連續抓取)【Python練習Day12】

練習Python AJAX爬蟲時,因為想要抓取多頁資料,碰到了Python爬蟲中文網址問題,在網路上找到答案(使用parse.quote解決),並成功連續抓取KKday資料,寫了一個查詢用的爬蟲小程式。

解決Python爬蟲中文網址問題!
解決Python爬蟲中文網址問題!

Python AJAX動態抓取

前一篇Python Ajax爬蟲實戰,抓取KKday行程 【Python練習Day11】,拿KKday網站練習,利用Python進行網路連線,使用Chrome開發者工具找到真正的資料網址。

但實務上,應該不會這樣一頁一頁去找(太花時間),因此希望能結合之前學到的技巧,寫成一支小程式,讓使用者輸入關鍵字、Python程式自動抓取資料。

Python中文網址問題

這邊用了Ajax爬蟲和連續抓取的技巧,但很快就碰上問題。

由於使用者輸入時用的是「中文」,網站撈取資料時會將中文網址轉碼,而在Python中會造成錯誤。

錯誤訊息

1609406427447@2x

Python爬蟲中文網址解決

最後在網路上找到解決方式,利用內建模組urllib中的parse即可解決。

import urllib.parse as parse
kw_url=parse.quote(kw) #----->將中文網址做轉換

Python中文網址爬蟲練習(Kkday多頁)

功能:

  1. 讓使用者輸入想要查詢的行程關鍵字
  2. 連線到kkday抓取資料總頁數
  3. 印出資料總頁數,讓使用者決定要印出幾頁資料
  4. 利用迴圈連續抓取資料
  5. 印出行程標題、介紹、報名網址
import sys
import urllib.request as req
import urllib.parse as parse
import json

def kkday():

  kw=input("關鍵字:")
  kw_url=parse.quote(kw)
 
  url="https://www.kkday.com/zh-tw/product/ajax_productlist/?country=&city=&keyword="+str(kw_url)
  n=1
  
  #建立一個request物件,附加request headers資訊
  request=req.Request(url, headers={
      "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
      
  }) #模擬一般使用者User-Agent

  with req.urlopen(request) as response:
    #data=response.read().decode("utf-8") #根據觀察,取得的資料為Json格式
    data=json.load(response)

  total_page=data["total_page"]
  print("相關行程總頁數:"+str(total_page))
  pages=int(input("需要抓取頁數:"))

  print(str(data["page_title"]))
  print("-----------------")
  
  while n< pages: 
    print("------【正在抓取第"+str(n)+"頁資料】------")
    url="https://www.kkday.com/zh-tw/product/ajax_productlist/?country=&city=&keyword="+str(kw_url)+"&page="+str(n)
    print(url)
    request=req.Request(url, headers={
      "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
  }) #模擬一般使用者User-Agent
    
    with req.urlopen(request) as response:
       cdata=json.load(response)
       clist=cdata["data"]
      
    for cdata in clist:
      print(cdata["name"])
      print(cdata["introduction"])
      print(str(cdata["price"])+" "+cdata["currency"])
      print(cdata["url"])
      print("-----------------")

    n=n+1
kkday()

執行結果:

解決Python爬蟲中文網址問題!(KKday多頁連續抓取)

本次練習檔與影片

練習檔網址:Day12-2(12/29):網路爬蟲(Web Crawler) KKay連續抓取
影片列表:Python 網路爬蟲 Web Crawler 教學 – AJAX / XHR 網站技術分析實務

【Python新手練習】相關文章

【Python新手練習】系列文,是一個行銷人學習Python的筆記,希望可以藉由練習程式,訓練更強大的邏輯思考,如果你也對這塊有興趣,這些文章或許可以幫助到你!也歡迎一起交流。

行銷人的Python練習90計畫-為什麼要學Python?
Day0:Google Colab新手Python開發環境推薦
Day1:Python變數與資料型態
Day2:Python判斷式與迴圈(流程控制)
Day3:Python函式 定義、呼叫與回傳
Day4:載入Python模組與使用
Day5:Python檔案讀取和儲存
Day6:Python亂數與統計
Day7:Python API 開放資料串接,抓取台北市政府公開資料
Day8:Python實體物件建立與使用
Day9:Python爬蟲實戰!抓取PTT電影版

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *