前言
Python網路爬蟲實例系列已經進入第六篇了,我們要試著來抓取「NOWnews今日新聞」的即時新聞列表,而透過底下說明可以發現它有使用 Ajax 動態載入,我們也可以更容易地取得資料。文末有附上完整程式碼供參考。
備註:此文僅教育學習,切勿用作商業用途,個人實作皆屬個人行為,本作者不負任何法律責任
套件
此次 Python 爬蟲主要使用到的套件:
安裝
|
|
流程
首先進入 NOWnews 今日新聞的即時新聞列表 網頁,來觀察看看其新聞列表載入方式。
打開瀏覽器的 開發人員工具 (F12 或 Ctrl + Shift + i),可能一開始會先透過"Elements"找網頁節點元素,馬上就開始寫爬蟲程式了。
但是等等,這樣除了要解析網頁,他頁面上有三種版型,還要各自分開解析,或許我們可以再花點時間觀察觀察。
開發人員工具切換到"Network" > "XHR",當我們點擊「看更多新聞」按鈕時,會發現有送出一個請求,單點選它打開之後,右邊選擇 Preview
分頁看一下其中的資料。
水啦~~~就是我們希望取得的新聞列表。
切換回 Headers
分頁,看一下此資料請求方式與網址。
使用"GET"的方式,網址為 https://www.nownews.com/nn-client/api/v1/cat/breaking/
。
ㄟ?! 那網址後方的參數 pid=5148899
代表什麼呢?
打開開發人員工具內的搜尋(Ctrl+F),觀察一下發現,原來是代表前一次資料中的最後一篇新聞ID啊~
可以將網址貼到瀏覽器的網址欄位中,查看回傳的資料。
OK
大致上原理與流程我們知道了,來開始將其轉換成 Python 程式碼吧!
爬蟲程式
先設定兩個變數,all_news
之後要裝抓取的新聞資料;pid
是記錄每頁最後一筆新聞的ID (為了請求下一頁)。
|
|
這邊使用 while
迴圈,num
代表我們想爬取的新聞數量,當數量還不到時,就繼續抓取。
請求的網址 url
後方記得帶上 pid
參數。第一頁只要空著就行,之後開始才需要給值。
|
|
我們先觀察之前取得的回傳資料:
* 為了方便觀察,我這邊使用 JSON Editor Online 線上工具來輔助演示。
參數 | 代表意思 | 格式 |
---|---|---|
id | ID | 文字 |
postTitle | 標題 | 文字 |
postUrl | 網址(包含請求分類) | 文字 |
postOnlyUrl | 網址(不包含請求分類) | 文字 |
sort | 排序 | 數字 |
postContent | 內容摘要 | 文字 |
imageUrl | 圖片網址 | 數字 |
newsDate | 發布日期 | 數字 |
回傳資料是 JSON 格式,直接使用 requests 提供的 r.json()
轉換。
新聞列表資料是放在 data
> newsList
中,並取得我們想要的欄位。
|
|
下一頁網址後方參數 pid
,就是這次的最後一筆新聞ID。
每次請求之間加入一小段延遲,避免太頻繁爬取,造成對方伺服器負擔。
|
|
完整程式碼
附上完整程式碼:nownews_spider.py
(對超連結右鍵 > 另存連結為)
延伸練習
- 試著抓取不同分類裡的新聞列表,例如:NOW電玩裡的最新新聞。
提示:雖然它看似採用"下一頁"的方式,但你實際點擊不同頁數時,發現到網址並無任何變化,或許它也是使用 Ajax 動態載入資料的方式呢~
結語
整體來說,NOWnews今日新聞的爬取方法與聯合新聞網蠻類似的,可以前往我之前寫的教學文參考。
我會陸續慢慢寫一些網站的Python網路爬蟲實例,如果你正好是剛開始想學爬蟲的新手、想知道某個網站如何爬取資料,又或遇到其他問題,歡迎參考與在底下留言喔~🔖
人生沒有最好的決定,只有在決定之後做到最好。
🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~