「AI 競品分析爬蟲」詳解

這個案例將帶領我們模擬真實的網路爬蟲情境,其複雜度比單純的 API 呼叫更高。我們不僅要向外部伺服器請求資料,還要處理其回傳的複雜結構。這份清單聚焦於本案例 Colab 筆記本中實際運用的核心 Python 元件,請各位務必掌握「請求」的標準函式庫,我們將模擬瀏覽器向伺服器發送一個 POST 請求來獲取「動態載入」的資料。

1. requests 函式庫與 HTTP POST 請求

核心概念: requests 是 Python 中用來發送網路請求的關鍵函式庫。在這個案例中,我們使用 requests.post() 來獲取目標網站的留言資料,這是一種常見的動態資料載入方式。

重點說明:

  • requests.post(): 許多網頁的內容(例如留言、評論)並不是一開始就寫在 HTML 裡,而是需要透過 POST 請求,主動向伺服器索取。學會 POST 是爬取這類動態網站的關鍵第一步。
  • url: (關鍵參數),這是想要請求數據的網址,通常使用 API 交換數據的網站,網址通常不是你在瀏覽器看到的,網址經常是需要使用 「開發者工具」來找到。這個案例中是一個電商的網址,也是透過開發者工具->Network功能找到的。
  • headers: 在發送請求時,我們通常需要附上 headers(標頭),用來模擬一個真實的瀏覽器,告知伺服器我們的身份。缺少正確的 headers 可能會導致請求失敗。
  • payload: POST 請求通常會伴隨著一個 payload(負載),也就是我們要傳送給伺服器的資料,用來告訴它我們想要哪一部分的數據(例如:第幾頁的留言)。

2. 字典 (dict) 與巢狀字典解析(nested dict parsing)

核心概念: 字典是本案例中處理資料的核心結構。從發送請求的 payload 到解析回傳的 response,都圍繞著字典的操作。

重點說明:

  • 建構請求 payload: 我們將 page 參數包裝在一個字典中,作為請求的 payload,精確地告訴伺服器我們需要第幾頁的資料。
  • 解析多層巢狀字典: 伺服器回傳的資料是多層嵌套的。我們需要學會如何依序存取字典的 key,例如 data['goodsCommentList']['comments'],才能從複雜的結構中,層層深入,最終定位到包含所有留言的那個列表 (list)。

3. for 迴圈與列表 (list) 操作

核心概念: 在成功從 JSON 中提取出包含所有留言的列表後,我們利用 for 迴圈來遍歷(iterate)這個列表,逐一處理每一則留言。

重點說明:

列表生成式」(List Comprehension): 這段程式碼的功能是:從一個比較複雜的資料結構中,快速地建立一個只包含留言文字的、乾淨的新列表。您可以把它想像成一個加工流水線,分成三個步驟來理解:

  1. for comment in data["goodsCommentList"] (原料來源):這部分是流水線的起點。它會先找到一個名為 data 的字典,然後從中取出鍵值為 goodsCommentList 的那個項目,這個項目本身是一個列表 (list),裡面裝了許多則留言。
  2. comment["comment"] (加工動作):從上一步取出的每一則 comment,它本身可能也是一個字典,裡面包含了留言者、時間、按讚數等多種資訊。這一步的動作是,只從這個 comment 字典中,挑出鍵值為 comment 的那一部分,也就是我們真正想要的「留言文字內容」。
  3. comments = [...] (成品裝箱):最外層的方括號 [] 代表「請幫我建立一個新的列表」。流水線會將每一步加工完成的「留言文字內容」,全部收集起來,放進這個新的列表中。

list.extend(): 我們建立一個名為 all_comments 的空列表,然後在迴圈中,將每一則留言的文字內容 ,逐一加入到這個新列表中,完成資料的萃取與整理。

"".join(): 最後再將這個新列表中的所有字串合併在一起,形成一個長字串。

4. if else 流程控制

核心概念: 檢查伺服器端的回應是否OK,如果OK代表請求成功,接著就開始處理接收到的資料,如過不成功就發出錯誤訊息。

重點說明:

if response.status_code == 200: (Note: Python 作為比較 “相等” 的運算子為 ==)

  • 這一行檢查 HTTP 回應的狀態碼是否等於 200。
  • status_code 是 HTTP 回應中的一個重要屬性,表示伺服器回應的結果狀態碼。
  • 狀態碼 200 代表 “OK”,表示請求成功並且伺服器成功處理了請求。

data = response.json()

  • 當狀態碼為 200 時,表示請求成功,因此接下來使用 response.json() 方法將伺服器返回的 JSON 格式數據轉換為 Python 字典並賦值給變數 data
  • 這一步是用來處理成功的回應,將 JSON 數據轉換為易於處理的 Python 字典(dict)數據結構。

else:

  • 如果回應的狀態碼不是 200(即請求失敗),則執行 else 區塊中的代碼,亦即列印一條錯誤信息,告訴你是哪一頁的請求失敗,並顯示該頁的狀態碼(例如 404 表示找不到頁面,500 表示伺服器錯誤等。

5. Google Gemini API 的應用

核心概念: 在我們成功爬取並整理好大量的留言文字後,下一步就是從這些非結構化資料中萃取有價值的資訊。這正是 Google Gemini API 發揮作用的地方。我們將整理好的留言列表傳送給 AI,讓它執行複雜的文本分析任務。你要學習如何在colab中儲存 (如果你使用其他AI模型,例如ChatGPT,也是一樣的方法),然後透過 Gemini 提供的函式來存取金鑰 (userdata.get()),和設定Gemini (config())。

重點說明:

  • 化繁為簡: AI 能夠快速閱讀數百則留言,並提煉出「摘要」、「關鍵主題」或「情緒傾向」。這將行銷人員從繁瑣的人工閱讀中解放出來,專注於策略層面。
  • 洞察發掘: 透過 AI 分析,我們可以量化消費者的情緒,或發現意想不到的討論熱點,這些都是寶貴的市場洞察。
  • 模組化呼叫: 與第一個案例相似,呼叫 AI 的程式碼通常會被封裝在一個獨立的函式中,讓主程式的邏輯更清晰:爬取資料 -> 呼叫AI分析 -> 呈現結果。

總結來說,這個案例的學習路徑是:

requests.post() 發送請求 -> response.json() 解析回傳資料 -> for 迴圈遍歷與萃取 -> 存入 list 整理 -> 轉換成長字串 ->呼叫 AI 分析