網頁抓取與 ETL:使用 BeautifulSoup 自動化數據提取


網頁抓取與 ETL:使用 BeautifulSoup 自動化數據提取

使用 Python 構建穩健的 ETL 流程

1. 介紹

在現今數據驅動的世界中,企業和研究人員大量依賴網頁數據來獲取洞見、做出預測並構建機器學習模型。然而,這些寶貴資訊往往以非結構化的形式存在於網頁上。這時候,網頁抓取就非常重要。

本文將聚焦於使用 Python 的 BeautifulSoup 庫來構建自動化 ETL(提取、轉換、加載)流程,從網頁抓取數據、清理、整理,再存入資料庫或 CSV/JSON 文件中,幫助你建立可擴展的數據收集與分析流程。

2. 在網頁抓取中的 ETL

ETL 代表 Extract(提取)、Transform(轉換)、Load(加載)。結合網頁抓取,ETL 成為強大的數據工程工具:

  • 提取:使用 requestshttpx 等庫抓取網站 HTML 原始內容。
  • 轉換:解析和清理抓取的 HTML,統一資料格式,處理缺失或不一致的資料。
  • 加載:將結構化資料存入資料庫、雲端倉儲或 CSV/JSON 文件。

本教程將使用 BeautifulSoup 解析 HTML、pandas 整理數據、以及 SQLite 存儲資料。此方法可擴展到企業級 ETL 或雲端數據倉儲。

示例圖片

3. 環境設置

在開始之前,請確保安裝 Python 3.8+ 並建立虛擬環境:

# 建立虛擬環境
python3 -m venv etl_env

# 啟動虛擬環境
source etl_env/bin/activate   # Linux/Mac
etl_env\Scripts\activate      # Windows

# 安裝依賴
pip install requests beautifulsoup4 pandas sqlite3

4. 提取:使用 BeautifulSoup 網頁抓取

ETL 的第一步是從網頁提取原始數據。我們使用 requests 抓取 HTML,再用 BeautifulSoup 解析:

4.1 範例:抓取工作列表

假設我們要從示例工作板抓取職缺資訊:

import requests
from bs4 import BeautifulSoup

url = "https://example-job-board.com/data-jobs"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

jobs = []
for job_card in soup.find_all("div", class_="job-card"):
    title = job_card.find("h2", class_="title").text.strip()
    company = job_card.find("span", class_="company").text.strip()
    location = job_card.find("span", class_="location").text.strip()
    jobs.append({"title": title, "company": company, "location": location})

print(jobs[:5])
示例圖片

5. 轉換:清理與結構化資料

抓取的數據通常很亂,可以使用 pandas 來清理、整理並準備資料:

import pandas as pd

df = pd.DataFrame(jobs)
df.fillna("未指定", inplace=True)
df.columns = [col.lower().replace(" ", "_") for col in df.columns]

print(df.head())

6. 加載:存儲數據

對於小型 ETL 流程,SQLite 是輕量且有效的存儲方案:

import sqlite3

conn = sqlite3.connect("jobs.db")
df.to_sql("job_listings", conn, if_exists="replace", index=False)

print("數據已成功加載到 SQLite 資料庫!")

7. 自動化 ETL 流程

可使用 cron jobsAirflowPrefect 自動化 ETL,例如設定每天凌晨 2 點自動執行:

# 編輯 crontab
crontab -e

# 每天凌晨 2 點執行 ETL
0 2 * * * /usr/bin/python3 /home/user/etl_pipeline.py

8. 處理動態網頁

部分網站使用 JavaScript 動態生成內容,單靠 BeautifulSoup 不足。可結合 Selenium

from selenium import webdriver
from bs4 import BeautifulSoup

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

driver.get("https://example.com")
soup = BeautifulSoup(driver.page_source, "html.parser")

data = soup.find_all("div", class_="dynamic-content")
print(len(data))

driver.quit()

9. 最佳實踐與法律考量

  • 遵守 robots.txt 和網站服務條款。
  • 請勿頻繁請求,設置合理延遲。
  • 使用描述性 User-Agent 標頭。
  • 緩存響應以減少不必要請求。
  • 遵守 GDPR、CCPA 等資料隱私規範。

10. 未來改進

  • 雲端 ETL:使用 AWS Glue、Google Dataflow 或 Apache Beam 部署。
  • 資料質量檢查:使用 Great Expectations 驗證資料一致性。
  • AI 驅動抓取:結合 LLM 自動生成抓取邏輯,應對複雜網站。
示例圖片

11. 結論

網頁抓取結合 ETL 為建立即時分析與數據驅動決策系統提供了堅實基礎。透過 BeautifulSoup 提取、pandas 轉換、以及 SQLite 等存儲方案,你可以輕鬆自動化整個數據流程。正確的自動化、擴展策略與道德實踐,能讓你的 ETL 系統升級為生產級數據平台。




发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注