【新聞挖掘工坊:第 5 篇】工程師的試煉:那些失敗與逆襲的妙招

破解 Yahoo News 重導與資源管理的挑戰

在爬 Google News 文章時,我們一度卡在「重導向」的迷宮裡:即使開了 allow_redirects=True,最終仍拿到 Google 的中繼頁面。直到 5 月 3 日那天,我和書慶大哥花了好幾天,才終於「客服」了這個難題。我們回頭觀察 Yahoo News 的 HTML,發現每篇文章頂端都會載入原始撰寫媒體的 Logo 圖片。於是,我們改為解析 <img> 標籤裡的 Logo 檔名,從中提取出對應媒體名稱,再透過這個線索獲得真實的文章來源 URL。

解決了重導向問題後,接著面臨的是記憶體飆升的痛苦。原本的程式在載入每個新分頁後,往往忘了適時關閉,導致 ChromeDriver 的進程一個接一個堆積,就像無限增長的恐怖小說怪物,最終讓整台機器陷入瀕死狀態。我們嘗試過在每次 driver.get() 後立刻呼叫 driver.quit(),卻又因為重啟成本太高,把執行效率拉到地板。最後,我們找到了一個折衷:在「載入完畢、抓到 Logo 並擷取連結」的訊號之後,再給瀏覽器一個短暫的緩衝(約 1–2 秒),才關閉分頁。這樣既能保留穩定的執行上下文,也不會長時間占用系統資源。

除了這些硬體層面的優化,我們還在瀏覽器層面做了兩項改良。第一是切換到「無痕模式」,讓瀏覽器不會持久化過多歷史紀錄;第二是在每次關閉分頁前,主動執行一段 JavaScript 清除所有 Cookies。這樣就不會因為歷史與 Cookie 爆炸,又觸發瀏覽器的記憶體或磁片緩衝上限,整個抓取流程才能在一天之內,耗費三小時,持續跑完三千則 Yahoo News,並將最終的 28,000 多筆資料下載下來而不當機。

網路封鎖與多 IP 輪換的實踐

那段時間,我不知刷了多少次 Google,IP 很快就被封鎖。想起 5 月 2 日下午,我們還在聊「12 月為何突然暴增」,於是馬上用不同 IP 重跑相同關鍵字,才發現那波高峰其實是某起社會矚目新聞引爆了大量二次報導。這次經驗讓我們明白:要破解「同一 IP 被臨時限流」的問題,最直接就是輪換多個代理伺服器,並搭配隨機延遲,讓每一次請求都像來自不同的「真人」。

我們先組了一個小型代理池,每次發出請求就從中隨機抽一個 IP;若某個 IP 連續出現 429,便把它暫時移至黑名單,隔幾分鐘後再放回。這樣既避免了單一 IP 過度使用,也能均攤流量壓力。事後觀察,代理輪換讓封鎖次數幾乎降至零,即便在流量最密集的時段,也能維持穩定抓取。

更有趣的是,透過多 IP 的對比,我們還意外察覺某些關鍵字在不同時段的真實熱度差異:比如五月因總統大選而激增的報導量,就能更清晰地浮現在我們的數據面板上。

關鍵字優化與多站點驗證

在最初的爬取中,我們只用「調查」、「偵查」、「判決」等 primary 關鍵字,結果抓到不少與警察無關的報導。5 月 2 日下午,我突然想到把「詐欺」、「毒品」、「傷害」等也加入關鍵字清單,沒想到那一條詞就像打開了潘朵拉盒,瞬間勾勒出一波獨立的報導高峰。

不過,過濾效果雖好,卻也發現了一些新的問題:同一則新聞經常被多家平台摘錄,資料量再次飆高。好在我們之前優化了去重策略,不但用統一的正規化方法去處理標題差異,也在程式中加入第二層過濾:同一 URL 在不同平台出現,就利用主機名稱和時間戳記進行判斷,只保留最早那筆。

最後,為了驗證資料品質,我們還跨站點比對了中國時報、法務部官網等來源,確保重點案例都在我們的資料庫中。透過多站點驗證,我們不僅補齊了資料缺口,也發現了很多意料之外的新聞洞見。

失敗的方法與痛點反思

當初我們也嘗試過一刀切地把所有站點都用同樣的程式碼跑一次 SQLlite 儲存,卻因為每家站點結構不同,導致錯誤百出。更麻煩的是,程式每次改一點,就要重跑全部資料,耗時又耗資源。最後,我們完全棄用「一支腳本跑到底」的做法,轉而分站點、分模組、分階段,才能有效降低單次迭代成本。

另一個失敗示範是,一開始只想用 Selenium 去做所有重導與解析,結果瀏覽器啟動時間過長,每個分頁浪費五秒以上,整體效率非常低。這正好印證了「功能越重,效率越低」的道理。後來在一兩天的思考突破後,我們改以靜態解析 Logo 標籤為主,必要時才啟動 Selenium 少量驗證,一舉解決了效率與穩定性的雙重問題。

成功的關鍵:人性化設計與靈活調整

這整段爬蟲旅程,我們一次次被 429、超時、記憶體爆滿、錯誤邊界反覆「教訓」,也一次次透過「人性化延遲」、「代理輪換」、「模組化設計」、「Logo 解析」、「分段關閉分頁」、「無痕與清除 Cookie」等精細調整,將程式從一匹野馬馴服成效率卓越的銀色快艇。

最終,我們成功在五天下課的時間內,把新聞資料庫從頭爬到尾,累積超過 28,000 條初步資料,去重後穩定保留 20,000 條優質新聞。這一切都要感謝書慶大哥在每個關鍵時刻提出的靈感:無論是「分站點專案」的模組化思考,還是「用 Logo 辨識媒體」的創意技巧,都讓我們一次次化險為夷。

從這場「挖掘」旅程中,我們深刻體會到:技術的核心不只是寫出程式,更在於尊重網路環境、理解資料差異、在失敗中快速學習並持續優化。這股「以人性的視角,雕刻自動化流程」的精神,才是我們在新聞挖掘工坊裡最寶貴的收穫。

Comments

Popular posts from this blog

【新聞挖掘工坊:第 2 篇】Google News RSS 祕密通道:怎麼抓新聞連結?

【統計抽樣 × NLP 節能分析:第 3 篇】階層、系統、叢集:三大抽樣法一次搞懂

區域網路扁平架構與 Zero Trust 缺口:從 Streamlit 測試到 IoT 隔離的安全評估