行政院本院新聞爬蟲:抓取新聞列表

import requests
import pandas as pd
from bs4 import BeautifulSoup
from urllib.parse import urljoin


### 設定網址
url = "https://www.ey.gov.tw/Page/6485009ABEC1CB9C"

headers = {
    "User-Agent": "Mozilla/5.0"
}


### 發送 HTTP 請求
response = requests.get(
    url,
    headers=headers,
    timeout=10
) # 向行政院網站發送 GET 請求,最多等待 10 秒

response.raise_for_status() # 如果請求失敗 (4xx、5xx),直接拋出例外

print("狀態碼:", response.status_code)


### 建立 BeautifulSoup
soup = BeautifulSoup(
    response.text,
    "lxml"
) # 將取得的 HTML 原始碼交給 BeautifulSoup 解析


### 找到所有新聞項目
news_items = soup.select(
    "ul.list-group-item > li"
) # 每一個 <li> 代表一則新聞

print("本頁新聞數量:", len(news_items))


### 抓取新聞資料
news_list = []

for item in news_items:
    title_element = item.select_one(".title") # 新聞標題
    date_element = item.select_one(".date") # 發布日期
    summary_element = item.select_one("p") # 新聞摘要
    link_element = item.select_one("a") # 新聞連結

    if title_element and date_element and link_element:
        title = title_element.get_text(
            " ",
            strip=True
        ) # 取得標題並移除多餘空白

        date = date_element.get_text(
            strip=True
        ) # 取得日期

        if summary_element:
            summary = summary_element.get_text(
                " ",
                strip=True
            ) # 取得摘要
        else:
            summary = "" # 影音新聞可能沒有摘要

        relative_url = link_element.get("href") # 取得相對網址

        news_url = urljoin(
            url,
            relative_url
        ) # 將相對網址轉換成完整網址

        news_list.append({
            "標題": title,
            "日期": date,
            "摘要": summary,
            "網址": news_url
        })


### 顯示新聞資料
for index, news in enumerate(news_list, start=1):
    print(f"\n{index} 則新聞")
    print("標題:", news["標題"])
    print("日期:", news["日期"])
    print("摘要:", news["摘要"])
    print("網址:", news["網址"])


### 轉換成 DataFrame
news_df = pd.DataFrame(news_list)

print("\n新聞資料表:")
print(news_df)


### 儲存成 CSV
news_df.to_csv(
    "行政院新聞列表.csv",
    index=False,
    encoding="utf-8-sig"
) # 使用 utf-8-sig,避免 Excel 開啟中文 CSV 時出現亂碼


### 執行完成
print("\n資料抓取完成")
print("共抓到:", len(news_list), "則新聞")
print("已產生:行政院新聞列表.csv")