聊天視窗

數據科學全能指南:從數據到洞察 - 第 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` | 環境一致、可擴充 | --- > **結語**:資料收集不僅是抓取資料,更是設計一套能持續、可靠、可監控的管線。從今天開始,將本章所學應用於實際專案,您就能在「資料抓取」與「資料存儲」之間架起穩固的橋梁,讓後續的清洗、探索、模型訓練等工作更順暢、更具可持續性。