返回目錄
A
數據科學全能指南:從數據到洞察 - 第 2 章
第二章:資料收集與存取
發布於 2026-02-22 22:18
# 第二章:資料收集與存取
資料收集是數據科學工作流程中最基礎、最關鍵的一環。\n\n本章將帶您從資料來源定位、API 取得、網路爬蟲,到資料庫操作,最後探討如何將整個流程構造成可擴充、可重用的自動化管線。\n\n---
## 2.1 資料來源概覽
| 類別 | 典型來源 | 典型格式 | 主要使用情境 |
|------|-----------|----------|-------------|
| 公開數據 | 政府開放資料平台、研究機構、機構 API | JSON / CSV / XML | 政策分析、城市規劃 |
| 企業內部 | ERP、CRM、IoT 監測設備 | Parquet / Delta Lake | 業務優化、預測維護 |
| 互聯網 | 企業網站、社群平台 | HTML / API | 市場研究、品牌監控 |
| 其他 | 影像資料庫、語音資料庫 | PNG / WAV | 影像分類、語音辨識 |
> **小提示**:在選擇資料來源前,先確認
> 1. 資料可用性(是否需要授權)
> 2. 資料更新頻率(實時 vs 批次)
> 3. 資料量與處理成本
## 2.2 公開 API 與授權機制
### 2.2.1 RESTful API
REST API 以 HTTP 方法(GET、POST、PUT、DELETE)為基礎,結構化、可擴充。常見端點結構:
http
GET https://api.example.com/v1/records?page=1&size=100
### 2.2.2 GraphQL
GraphQL 允許客戶端明確指定所需字段,減少過度/不足傳輸。示例請求:
graphql
query {
record(id: "123") {
id
name
updatedAt
}
}
### 2.2.3 認證方式
| 認證類型 | 應用場景 | 典型標頭 |
|----------|-----------|----------|
| API Key | 簡單讀取 | `Authorization: Bearer YOUR_KEY` |
| OAuth 2.0 | 用戶授權 | `Authorization: Bearer ACCESS_TOKEN` |
| JWT | 內部服務 | `Authorization: Bearer JWT_TOKEN` |
> **實作範例(Python + requests)**
>
> python
> import requests
> headers = {
> "Authorization": "Bearer YOUR_API_KEY",
> "Accept": "application/json"
> }
> response = requests.get("https://api.example.com/v1/records", headers=headers)
> data = response.json()
> print(data[0])
>
## 2.3 網路爬蟲實務
### 2.3.1 爬蟲基本概念
1. **靜態爬取**:直接下載 HTML 內容,使用 BeautifulSoup、lxml 解析。
2. **動態爬取**:需執行 JavaScript,常用 Selenium、Playwright 或 Splash。
3. **節流**:使用 `time.sleep()` 或 `asyncio` 控制請求速率,避免被封鎖。
### 2.3.2 Scrapy 框架示例
Scrapy 提供高效的爬蟲框架,支持異步、管道、下載中介層等。
python
# scrapy project: myproject
# 1. create spider
# myproject/spiders/example.py
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = ["https://www.example.com/data"]
def parse(self, response):
for item in response.css(".record"):
yield {
"id": item.css(".id::text").get(),
"value": item.css(".value::text").get(),
}
### 2.3.3 合法性與禮節
| 原則 | 具體做法 |
|------|----------|
| 遵守 robots.txt | `curl -I https://example.com/robots.txt` |
| 設置 User-Agent | `User-Agent: Mozilla/5.0 (compatible; MyCrawler/1.0; +http://mydomain.com)` |
| 速率限制 | `DOWNLOAD_DELAY = 2` |
| 版權尊重 | 只抓取公共資料,避免爬取付費內容 |
## 2.4 資料庫操作
### 2.4.1 SQL vs NoSQL
| 特性 | SQL | NoSQL |
|------|-----|-------|
| 結構 | 固定 schema | 自由 schema |
| 查詢語言 | SQL | NoSQL 專用語言或簡易 API |
| 交易 | ACID | BASE |
| 擴展性 | 水平擴展較難 | 水平擴展容易 |
### 2.4.2 連線示例
使用 **SQLAlchemy** 提供 ORM 與原始 SQL 並行。以下為 PostgreSQL 連線範例:
python
from sqlalchemy import create_engine
engine = create_engine(
"postgresql+psycopg2://user:password@localhost:5432/mydb"
)
# 執行原始 SQL
result = engine.execute("SELECT * FROM users LIMIT 5")
for row in result:
print(row)
> **提示**:對於大數據量,建議使用 `engine.raw_connection()` 取得低階連線,並利用 `psycopg2.extras.execute_values` 進行批量寫入。
### 2.4.3 資料匯入匯出
| 工具 | 說明 |
|------|------|
| `COPY` | PostgreSQL 原生快速匯入/匯出 |
| `pg_dump` / `pg_restore` | 完整資料庫備份 |
| `mongoimport` / `mongoexport` | MongoDB 快速匯入/匯出 |
| `pd.to_sql()` / `pd.read_sql()` | Pandas 與 SQL 互轉 |
## 2.5 建構可擴充流程
### 2.5.1 佇列與任務排程
- **Celery**:分佈式任務排程,配合 Redis 或 RabbitMQ。
- **Airflow**:工作流編排,支持 DAG、重試、依賴關係管理。
python
# example: Airflow DAG
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
with DAG("data_ingest", start_date=datetime(2023, 1, 1), schedule_interval="@daily") as dag:
def fetch_api():
# 取資料
pass
task_fetch = PythonOperator(task_id="fetch_api", python_callable=fetch_api)
### 2.5.2 容器化
- **Docker**:將爬蟲、API 客戶端、資料庫封裝成容器,確保環境一致。
- **Docker Compose**:定義多容器服務,簡化本地開發與測試。
yaml
# docker-compose.yml
version: "3"
services:
app:
build: ./app
depends_on:
- postgres
postgres:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
### 2.5.3 版本管理與 CI
| 步驟 | 建議做法 |
|------|-----------|
| 代碼版本 | Git + GitHub / GitLab |
| 配置版本 | Terraform / Pulumi |
| CI | GitHub Actions / GitLab CI | `tests`、`lint`、`build`、`docker push` |
## 2.6 常見工具總結
| 類別 | 推薦工具 | 主要優勢 |
|------|-----------|-----------|
| API 客戶端 | `requests`, `httpx` | 簡潔、同步/非同步 |
| 爬蟲 | `Scrapy`, `Selenium`, `Playwright` | 高效、可擴充、JavaScript 支援 |
| 資料庫 | `psycopg2`, `sqlalchemy`, `pymongo` | ORM、原始 SQL、易於擴充 |
| 工作流 | `Airflow`, `Prefect`, `Dagster` | 依賴管理、可重試、監控 |
| 佇列 | `Celery`, `RabbitMQ`, `Redis` | 分佈式執行、可靠消息傳遞 |
| 容器化 | `Docker`, `Docker‑Compose`, `k8s` | 環境一致、可擴充 |
---
> **結語**:資料收集不僅是抓取資料,更是設計一套能持續、可靠、可監控的管線。從今天開始,將本章所學應用於實際專案,您就能在「資料抓取」與「資料存儲」之間架起穩固的橋梁,讓後續的清洗、探索、模型訓練等工作更順暢、更具可持續性。