iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
Software Development

從零開始學 Python系列 第 26

Day 26 – BeautifulSoup 初探:抓取網頁標題

  • 分享至 

  • xImage
  •  

今天的學習重點

  • 什麼是網頁爬蟲?
  • 安裝與使用 BeautifulSoup
  • 抓取網頁 HTML
  • 提取網頁標題
  • 延伸:找出特定標籤

一、什麼是網頁爬蟲(Web Crawler / Web Scraper)?

「爬蟲」其實就是一個自動化程式,能模擬人類打開瀏覽器的動作,把網頁內容下載下來,並從中擷取需要的資料。
常見用途:

  • 蒐集新聞標題 → 自動抓取最新新聞
  • 比價系統 → 從不同網站抓取商品價格做比對
  • 研究分析 → 下載大量公開文章/評論,進行文本分析
  • 自動化工作 → 例如每天抓天氣、股價、匯率

要注意:

  • 必須遵守網站的 robots.txt(網站提供的爬蟲規範)
  • 不要短時間內發送過多請求,以免對伺服器造成負擔
  • 不要抓取有隱私或需要登入的敏感資訊

網頁爬蟲的流程

  1. 發送請求(Request)
  • 用 requests 模組,向網頁伺服器發出「請給我這個頁面」的要求
  • 回傳結果通常是 HTML 格式
  1. 取得 HTML(Response)
  • 網頁內容會以字串的形式回來
  • 看起來是一大串 html ... /html 的標籤
  1. 解析 HTML
  • 這時候需要一個工具把 HTML 樹狀化
    Python 常用的工具就是 BeautifulSoup
  1. 擷取資料
  • 找到想要的標籤(如 titleadiv
  • 提取文字或屬性
  1. 儲存/應用
  • 例如存到文字檔、CSV、資料庫
  • 或是直接做分析(統計、機器學習等)

二、BeautifulSoup 的角色

BeautifulSoup 是一個「HTML 解析器」。
它能把雜亂的 HTML 變成「樹狀結構」,讓你用簡單的方式找到想要的資料。
例如

from bs4 import BeautifulSoup

html = "<html><head><title>Python 爬蟲教學</title></head><body><p>Hello!</p></body></html>"
soup = BeautifulSoup(html, "html.parser")

print(soup.title.text)  # 輸出: Python 爬蟲教學
print(soup.p.text)      # 輸出: Hello!

註解:

  • soup.title → titlePython 爬蟲教學/title
  • soup.title.text → Python 爬蟲教學
    (只取文字,不要標籤)
  • soup.p.text → Hello!

常見應用

  1. 抓取標題
print(soup.title.text)
  1. 抓取所有連結
for link in soup.find_all("a"):
    print(link.get("href"))
  1. 抓取特定 class 的內容
soup.find("div", class_="price").text
  • 爬蟲的核心就是:requests 抓 → BeautifulSoup 解析 → 提取資料。
    適合應用於新聞、比價、公開資料
    要小心法律與道德規範(不要 DDoS 網站,也不要爬私人資料)

安裝 BeautifulSoup

在 Python 中,常用的 HTML 解析工具是 BeautifulSoup(搭配 requests)。
安裝方式:

pip install requests beautifulsoup4

螢幕擷取畫面 2025-08-28 154930

三、抓取網頁 HTML

先用 requests 取得網頁內容:

import requests

url = "https://example.com"
response = requests.get(url)

print(response.text)  # 輸出 HTML 原始碼

螢幕擷取畫面 2025-08-28 155516
螢幕擷取畫面 2025-08-28 155543

四、使用 BeautifulSoup 解析 HTML

把 HTML 交給 BeautifulSoup 處理:

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, "html.parser")

# 抓取標題
title = soup.title.string
print("網頁標題:", title)

螢幕擷取畫面 2025-08-28 155651

五、延伸:找出所有超連結

links = soup.find_all("a")
for link in links:
    print("文字:", link.text, "| 連結:", link["href"])

輸出:

文字: More information... | 連結: https://www.iana.org/domains/example

學習心得

今天第一次用 BeautifulSoup,感覺就像把 HTML 拆開來看,用 .title 就能抓到標題,用 .find_all() 就能批次抓元素。原本覺得「爬蟲」好像很神秘,其實就是「抓網頁 → 解析 HTML → 提取想要的東西」。
原本有個exercise:擷取 iThome 鐵人賽的標題

url = "https://ithelp.ithome.com.tw/articles"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

titles = soup.find_all("a", class_="qa-list__title-link")

for i, t in enumerate(titles[:5], 1):  # 只顯示前 5 筆
    print(f"{i}. {t.text.strip()}")

但伺服器好像回傳空白頁面,沒有給我任何資訊
螢幕擷取畫面 2025-08-28 161113
問了GPT,他說要改成加上 User-Agent的版本:

import requests
from bs4 import BeautifulSoup

url = "https://ithelp.ithome.com.tw/articles"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/114.0.0.0 Safari/537.36"
}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

titles = soup.find_all("a", class_="qa-list__title-link")

for i, t in enumerate(titles[:5], 1):  # 只顯示前 5 筆
    print(f"{i}. {t.text.strip()}")

結果真的抓到了!
螢幕擷取畫面 2025-08-28 161625
所以這邊來說明一下什麼是User-Agent!
User-Agent 是一個 HTTP 請求標頭(Header),它用來告訴伺服器「我是什麼軟體來存取你的網站」。
比如說:
我用 Chrome 瀏覽器打開網頁,瀏覽器會送一個 User-Agent 告訴伺服器:「我是 Chrome,版本多少,跑在 Windows 11 上」。如果是 iPhone 的 Safari,就會送出不同的 User-Agent。

為什麼爬蟲要加 User-Agent?
如果直接用 requests.get(url),預設的 User-Agent 是 Python 的 requests。很多網站會認出來「這不是瀏覽器,是程式!」,然後就擋掉、不給完整資料,或直接回空白。所以我們常常要偽裝成「一般使用者的瀏覽器」,加上一個瀏覽器的 User-Agent,伺服器才會回傳正常頁面。

範例:Chrome 瀏覽器的 User-Agent

Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) 
Chrome/114.0.0.0 Safari/537.36

明天我要嘗試 初學 GUI:用 tkinter 做小視窗程式,讓程式不只是跑在黑底的終端機,而是能夠有簡單的視覺化介面!


上一篇
Day 25 – 使用 requests 模組存取 API
下一篇
Day 27 – 初學 GUI:用 tkinter 建立小視窗程式
系列文
從零開始學 Python30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言