網頁抓取與 ETL:使用 BeautifulSoup 自動化數據提取
使用 Python 構建穩健的 ETL 流程
1. 介紹
在現今數據驅動的世界中,企業和研究人員大量依賴網頁數據來獲取洞見、做出預測並構建機器學習模型。然而,這些寶貴資訊往往以非結構化的形式存在於網頁上。這時候,網頁抓取就非常重要。
本文將聚焦於使用 Python 的 BeautifulSoup 庫來構建自動化 ETL(提取、轉換、加載)流程,從網頁抓取數據、清理、整理,再存入資料庫或 CSV/JSON 文件中,幫助你建立可擴展的數據收集與分析流程。
2. 在網頁抓取中的 ETL
ETL 代表 Extract(提取)、Transform(轉換)、Load(加載)。結合網頁抓取,ETL 成為強大的數據工程工具:
- 提取:使用
requests或httpx等庫抓取網站 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 jobs、Airflow 或 Prefect 自動化 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 系統升級為生產級數據平台。


