[Python 爬蟲] 如何爬取以 WordPress 架設的網站 Blog 文章
判斷網站是不是以 WP 架設,以及使用 API 爬取文章
互連網世界中的網站有超過 40% 是用 WordPress 架設的。WordPress (WP) 是一個開源、使用者友善、且擁有豐富的外掛及佈景主題生態系的內容管理系統 (Content Management System, CMS)。它可以用來架設部落格、電子商務、公司門戶、論壇等各種不同類型的網站。所以如果你想要爬取資料,滿有可能會遇到一個 WP 網站,本文說明怎麼透過 API 爬取以 WordPress 架設的 Blog 文章。
檢查網站是否以 WordPress 架設
為什麼要知道一個網站是不是以 WordPress 架設?除了爬取資料的需要外,有時候你也會想知道「這樣的網站版型/架構能不能用 WP 做出來」,進而套用在自己的 WP 網站上。要檢查一個網站是不是以 WP 架設有多種方式,以下列出比較方便的幾種:
- 直接在網址後面接上
/wp-admin
。/wp-admin
是 WP 預設的管理者登入網址,以卡門人妻這個 部落格為例,其網址是 https://wifekaman.com/,而你會在 https://wifekaman.com/wp-admin 看到類似以下的登入畫面。管理者網址是可以關閉或修改的,但是大部分的個人使用者或中小企業不會去動它
![](https://jlin.blog/wp-content/uploads/2023/01/wp-login.png)
- 檢視網頁原始碼,找尋特殊字串如
wp-content
。在瀏覽器網頁中按右鍵 → 檢視原始碼,在原始碼中搜尋 WP 系統的特殊字串如wp-content
![](https://jlin.blog/wp-content/uploads/2023/01/wp-content-in-source.png)
- 使用現成的服務。把網址丟到現成的服務如 isitwp.com 中檢查
![](https://jlin.blog/wp-content/uploads/2023/01/isitwp-example.png)
透過 WordPress API 取得 Blog Posts
WordPress 系統有內建 REST API 支援,所以如果你想要爬取一個 WP 網站的 Blog 文章,就不要再事倍功半地去解析網頁文件架構了,直接使用以下 API endpoint 就好:
一樣以卡門人妻部落格為例,輸入 https://wifekaman.com/wp-json/wp/v2/posts/ 後會看到以下資料:
![](https://jlin.blog/wp-content/uploads/2023/01/wifekamen-example.png)
預設是一次回傳 10 筆資料 (可通過 per_page
參數調整,上限為 100);同時在 Response Headers 中的 x-wp-total
與 x-wp-totalpages
會顯示網站的總文章數與頁數:
![](https://jlin.blog/wp-content/uploads/2023/01/x-wp-totalpage.png)
以上面的例子來說,這個部落格總共有 420 篇文章、42頁,預設是回傳第一頁的 10 篇文章,在網址加上 page
參數就可以取得剩下的文章,例如:
完整範例程式碼
執行結果
例外情況
- WP 內建的 API endpoint 是可以被網站擁有者關閉的。以閱讀前哨站為例,會看到以下的回應:
![](https://jlin.blog/wp-content/uploads/2023/01/wp-api-blocked.png)
- 以上的 API endpoint 是在自有主機上架站、安裝 WP 的網站才會有。如果網站是透過 WordPress.com 建置的,WordPress.com 有提供另外一套 REST API。例如這個網站,可以透過以下 endpoint 取得文章:
![](https://jlin.blog/wp-content/uploads/2023/01/wordpress-com-example.png)
想系統化學習 Python 網路爬蟲,可以參考 Python 網頁爬蟲入門實戰:經典長銷、千人好評的 Python 爬蟲課程