返回目錄
A
數據驅動決策:從原始資料到洞察的全流程 - 第 2 章
第 2 章:資料蒐集與獲取
發布於 2026-02-22 13:38
# 第 2 章:資料蒐集與獲取
資料是數據科學的原料,資料蒐集與獲取階段決定了後續分析的可行性與品質。 本章將帶你從概念到實務,了解
1. **資料來源分類**:結構化、非結構化、實時流;
2. **獲取手段**:API、網路爬蟲、企業內部資料庫、感測器、第三方資料供應商;
3. **工具與技術**:SQL、Pandas、Spark、Kafka、REST/GraphQL、Scrapy、Selenium 等;
4. **合規與治理**:授權、隱私、資料治理。
---
## 2.1 資料來源概覽
| 資料類型 | 特徵 | 優勢 | 典型範例 |
|----------|------|------|----------|
| **結構化資料** | 行(rows)×列(columns) | 方便 SQL 查詢、數據完整性高 | 交易記錄、客戶資料、會計帳簿 |
| **半結構化資料** | 如 JSON、XML | 具備靈活性、可擴充 | 網站 API 回應、物聯網感測數據 |
| **非結構化資料** | 文字、影像、音訊、影片 | 大量資訊、語意豐富 | 產品評論、社群貼文、客服錄音 |
| **實時流資料** | 持續進入的事件序列 | 低延遲決策、即時分析 | 金融交易、網路行為、IoT 事件 |
> **實務洞察**:在建模前先做「資料來源盤點」表(See Table 2‑1)能明確哪些資料可直接使用、哪些需要預處理或合併。
| 資料來源 | 是否可即時使用 | 需要轉換 | 典型工具 |
|----------|--------------|----------|-----------|
| 企業內部資料庫 | ✔ | 否 | MySQL, PostgreSQL, SQL Server, Snowflake |
| 第三方 API | ✔ | 需要 | Requests, HTTPX, GraphQL client |
| Web 站點 | ⚠ | 高 | Scrapy, BeautifulSoup, Selenium |
| 物聯網感測 | ✔ | 需要 | MQTT, Kafka, Spark Structured Streaming |
| 社群媒體 | ⚠ | 高 | Tweepy, Facebook Graph API, Instagram API |
## 2.2 資料獲取流程圖
mermaid
flowchart TD
A[需求定義] --> B[資料來源分析]
B --> C{來源類型}
C -->|結構化| D[SQL 連線]
C -->|半結構化| E[API 請求]
C -->|非結構化| F[爬蟲]
C -->|實時流| G[Kafka / Spark]
D --> H[資料檢索]
E --> H
F --> H
G --> H
H --> I[資料存儲]
I --> J[資料治理]
## 2.3 具體實作示例
### 2.3.1 連接企業資料庫(PostgreSQL)
python
import psycopg2
import pandas as pd
conn = psycopg2.connect(
dbname='sales_db',
user='db_user',
password='secret',
host='10.0.0.5',
port=5432
)
query = """
SELECT customer_id, purchase_date, amount
FROM transactions
WHERE purchase_date >= '2023-01-01';
"""
df = pd.read_sql(query, conn)
print(df.head())
> **提示**:使用 `sqlalchemy` 可輕鬆轉換為 ORM,提升可維護性。
### 2.3.2 呼叫 REST API(Python Requests)
python
import requests
import pandas as pd
url = 'https://api.example.com/v1/customers'
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Accept': 'application/json'
}
response = requests.get(url, headers=headers, params={'page': 1, 'size': 100})
if response.status_code == 200:
data = response.json()
df = pd.DataFrame(data['customers'])
print(df.info())
else:
print('Error:', response.status_code)
### 2.3.3 網路爬蟲(Scrapy 範例)
python
# 在 scrapy project 裡新增 spiders/real_estate_spider.py
import scrapy
class RealEstateSpider(scrapy.Spider):
name = 'real_estate'
start_urls = ['https://example.com/house-list']
def parse(self, response):
for house in response.css('.house-card'):
yield {
'title': house.css('.title::text').get(),
'price': house.css('.price::text').get(),
'url': house.css('a::attr(href)').get(),
}
> **安全注意**:遵守 `robots.txt` 規則,且若需要瀏覽器互動可用 Selenium,但需留意 Cookie & User‑Agent 篡改。
### 2.3.4 實時流(Kafka + Spark Structured Streaming)
python
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName('KafkaStreaming') \
.getOrCreate()
stream_df = spark.readStream \
.format('kafka') \
.option('kafka.bootstrap.servers', 'broker1:9092,broker2:9092') \
.option('subscribe', 'user_events') \
.load()
# 解析 key/value JSON
stream_df = stream_df.selectExpr("CAST(value AS STRING) as json_str") \
.selectExpr("json_tuple(json_str, 'user_id', 'action', 'timestamp') as (user_id, action, ts)")
query = stream_df.writeStream \
.format('delta') \
.outputMode('append') \
.option('checkpointLocation', '/checkpoints/user_events') \
.start('/data/warehouse/user_events')
query.awaitTermination()
## 2.4 資料倉儲策略
| 儲存方案 | 主要用途 | 優勢 | 典型技術 |
|----------|----------|------|-----------|
| **資料倉庫 (DW)** | 事務性、結構化查詢 | ACID、易於 BI | Snowflake, BigQuery, Redshift |
| **資料湖 (DL)** | 大量原始資料、非結構化 | 彈性、可延伸 | S3, HDFS, Azure Data Lake |
| **資料湖倉 (DLC)** | 結構化 + 非結構化 | 高效、易於探索 | Databricks, Hive, Glue |
> **合規**:在將資料寫入資料湖時,務必先加入 *metadata schema*(例如 `Delta Lake` 的 schema enforcement),確保
> 資料類型與結構一致。
## 2.5 合規與治理
| 規範 | 主要關注點 | 具體措施 |
|------|-------------|-----------|
| **GDPR / CCPA** | 個人資料、同意 | 需求同意收集、刪除權、資料匿名化 |
| **資料授權** | 版權、商業授權 | 取得授權文件、使用 `pydantic` 進行 schema 驗證 |
| **資料品質** | 完整性、正確性 | 使用 `Great Expectations` 或自訂 schema validation |
| **資料血統** | Provenance、版本管理 | 加入 `DataHub`、`Amundsen` 等資料目錄 |
> **實務案例**:在蒐集社群貼文時,必須檢查 API 供應商的使用條款,若有「商業用途限制」,需重新談判或尋找備援來源。
## 2.6 小結
1. **先定義需求**:清楚知道要做什麼,才能篩選合適的資料來源。
2. **分類資料**:結構化資料最容易即時使用,非結構化資料需要更複雜的前處理。
3. **選擇技術**:根據來源類型選擇適合的工具,例如 SQL 連線、REST API、爬蟲、Kafka。
4. **確保合規**:授權、隱私與治理不是後台工作,而是資料蒐集的基礎。
> **最佳實踐**:建立「資料蒐集工作流程」與「資料源評估表」兩份文件,作為資料工程師與業務部門溝通的共用語言。
---
> **下一章預告**:在第 3 章「資料探索與清洗」中,我們將進一步探討如何驗證資料品質、處理缺失值與重複項,將本章蒐集到的原始資料轉化為可用的分析資料集。