中文Wikipedia爬蟲:以蔡阿嘎為例

import requests
import pandas as pd
from bs4 import BeautifulSoup

### 設定網址

url = "https://zh.wikipedia.org/wiki/蔡阿嘎"
headers = {
"User-Agent": "Mozilla/5.0"
}

### 發送 HTTP 請求

response = requests.get(url, headers=headers, timeout=10) # 向 Wikipedia 發送 GET 請求,最多等待 10 秒
response.raise_for_status() # 如果請求失敗 (4xx、5xx),直接拋出例外

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

### 建立 BeautifulSoup

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

### 抓取頁面標題

title = soup.select_one("h1") # 使用 CSS Selector 找到第一個 <h1>

if title:
print("\n頁面標題:")
print(title.get_text(strip=True)) # 取得標題文字,並移除前後空白

### 抓取右側基本資料表

info_list = []
info_table = soup.select_one("table.infobox") # 找到 Wikipedia 右側的 infobox 資料表

if info_table:
rows = info_table.select("tr") # 取得資料表中的所有列

    for row in rows:
        field = row.select_one("th") # <th> 通常是欄位名稱
        value = row.select_one("td") # <td> 通常是欄位內容

        if field and value:
            field_text = field.get_text(" ", strip=True) # 取得欄位名稱
            value_text = value.get_text(" ", strip=True) # 取得欄位內容

            info_list.append({
                "欄位": field_text,
                "內容": value_text
            })

### 顯示基本資料

print("\n基本資料:")

for item in info_list:
print(f"{item['欄位']}{item['內容']}")

### 儲存基本資料 CSV

info_df = pd.DataFrame(info_list) # 將基本資料轉換成 DataFrame

info*df.to_csv(
"蔡阿嘎*基本資料.csv",
index=False,
encoding="utf-8-sig"
) # 使用 utf-8-sig,避免使用 Excel 開啟中文 CSV 時出現亂碼

### 抓取章節標題

print("\n文章章節:")

headings = soup.select(
".mw-parser-output h2, "
".mw-parser-output h3"
) # 同時取得文章中的 h2 與 h3 標題

for heading in headings:
heading_text = heading.get_text(" ", strip=True) # 取得章節標題文字
print(heading_text)

### 抓取文章內文

paragraph_list = []
paragraphs = soup.select(".mw-parser-output > p") # 取得文章主要內容區域第一層的 <p>

for paragraph in paragraphs:
text = paragraph.get_text(" ", strip=True) # 取得段落文字並移除前後空白

    if text: # 排除沒有文字的空白段落
        paragraph_list.append(text)

### 顯示文章內文

print("\n文章內文:")

for paragraph in paragraph_list:
print(paragraph)
print()

### 儲存文章內文

with open("蔡阿嘎\_文章內文.txt", "w", encoding="utf-8") as file:
file.write(f"標題:{title.get_text(strip=True)}\n\n") # 寫入文章標題

    for paragraph in paragraph_list:
        file.write(paragraph + "\n\n") # 每個段落之間空一行

### 執行完成

print("資料抓取完成")
print("已產生:蔡阿嘎*基本資料.csv")
print("已產生:蔡阿嘎*文章內文.txt")