行政院本院新聞爬蟲:抓取新聞列表
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")