前言
每个数据产品的背后,都有一个不为人知的爬虫在默默付出。
这篇文章将带你走完数据的一生:从互联网的犄角旮旯把它抓回来,洗干净,存起来,分析它,最后包装成一个能赚钱(或者能交差)的数据产品。
完整链路:爬虫采集 → 数据清洗 → 数据存储 → 数据分析 → 产品输出
第一章:爬虫采集 —— 数据的起点
爬虫三件套
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 最朴素的爬虫
response = requests.get('https://example.com', headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(response.text, 'html.parser')
data = soup.find_all('div', class_='target')进阶选择
| 场景 | 工具 | 一句话点评 |
|---|---|---|
| 静态页面 | requests + BeautifulSoup | 够用,简单 |
| 动态渲染 | Selenium / Playwright | 慢但稳,模拟浏览器 |
| 大规模采集 | Scrapy | 异步框架,专业选手 |
| API接口 | requests + json | 最舒服的方式 |
爬虫的生存法则
import time
import random
# 法则1:限速,别把人家服务器搞崩
time.sleep(random.uniform(1, 3))
# 法则2:伪装,像个正常用户
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.google.com',
}
# 法则3:异常处理,网络是不可靠的
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
except requests.RequestException as e:
print(f"寄了: {e}")⚠️ 免责声明:爬虫有风险,抓取需谨慎。请遵守robots.txt,尊重网站条款,别干违法的事。
第二章:数据清洗 —— 脏活累活
爬回来的数据就像菜市场买的菜——带着泥,夹着烂叶子,偶尔还有虫。
常见问题清单
| 问题 | 表现 | 解决方案 |
|---|---|---|
| 空值 | NaN、None、空字符串 | dropna / fillna |
| 重复 | 同一条数据出现多次 | drop_duplicates |
| 格式混乱 | "¥100"、"100元"、"100.00" | 正则 + 类型转换 |
| 编码问题 | 乱码、\x00 | 指定encoding |
| 异常值 | 年龄=-1,价格=999999999 | 条件过滤 |
清洗代码模板
import pandas as pd
import re
def clean_price(price_str):
"""把各种奇葩价格格式统一成float"""
if pd.isna(price_str):
return None
# 干掉所有非数字和小数点
clean = re.sub(r'[^\d.]', '', str(price_str))
return float(clean) if clean else None
def clean_data(df):
# 1. 删除完全重复的行
df = df.drop_duplicates()
# 2. 删除关键字段为空的行
df = df.dropna(subset=['id', 'name'])
# 3. 清洗价格字段
df['price'] = df['price'].apply(clean_price)
# 4. 过滤异常值
df = df[df['price'] > 0]
df = df[df['price'] < 1000000] # 排除天价异常
# 5. 统一日期格式
df['date'] = pd.to_datetime(df['date'], errors='coerce')
return df第三章:数据存储 —— 给数据找个家
存储方案选型
| 数据量 | 查询需求 | 推荐方案 |
|---|---|---|
| < 10万 | 简单 | CSV / SQLite |
| 10万 - 1000万 | 结构化查询 | MySQL / PostgreSQL |
| > 1000万 | 复杂分析 | ClickHouse / Doris |
| 非结构化 | 灵活schema | MongoDB |
| 向量检索 | 语义搜索 | ChromaDB / Pinecone |
快速落库示例
# 方案1:简单粗暴存CSV(小数据量够用)
df.to_csv('data.csv', index=False)
# 方案2:SQLite(单机王者)
import sqlite3
conn = sqlite3.connect('data.db')
df.to_sql('products', conn, if_exists='replace', index=False)
# 方案3:MySQL(正经项目标配)
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:pass@localhost/db')
df.to_sql('products', engine, if_exists='append', index=False, chunksize=1000)第四章:数据分析 —— 让数据说话
描述性分析
# 基础统计
df.describe()
# 分布查看
df['category'].value_counts()
# 分组聚合
df.groupby('category').agg({
'price': ['mean', 'min', 'max'],
'sales': 'sum'
})可视化速成
import matplotlib.pyplot as plt
# 一行代码出图
df['price'].hist(bins=50)
df.groupby('category')['sales'].sum().plot(kind='bar')
plt.show()进阶:机器学习加持
from sklearn.cluster import KMeans
# 用户分群
features = df[['purchase_count', 'total_amount', 'avg_price']]
kmeans = KMeans(n_clusters=4)
df['user_group'] = kmeans.fit_predict(features)第五章:产品输出 —— 数据变现
数据躺在数据库里不会生钱,得包装成产品。
产品形态一览
| 形态 | 适用场景 | 技术栈 |
|---|---|---|
| API服务 | 对外提供数据查询 | FastAPI / Flask |
| 数据报表 | 定期汇报 | Excel / PDF |
| BI看板 | 实时监控 | Grafana / Superset |
| 数据大屏 | 展厅装X | ECharts / DataV |
| 小程序/App | C端用户 | 前端框架 |
FastAPI快速出API
from fastapi import FastAPI
import pandas as pd
app = FastAPI()
df = pd.read_csv('data.csv')
@app.get("/products")
def get_products(category: str = None, limit: int = 10):
result = df
if category:
result = result[result['category'] == category]
return result.head(limit).to_dict('records')
@app.get("/stats")
def get_stats():
return {
"total": len(df),
"avg_price": df['price'].mean(),
"categories": df['category'].nunique()
}自动化报表
import schedule
def generate_daily_report():
df = fetch_latest_data()
stats = analyze(df)
export_to_excel(stats, f'report_{today}.xlsx')
send_email(to='boss@company.com', attachment=f'report_{today}.xlsx')
# 每天早上9点执行
schedule.every().day.at("09:00").do(generate_daily_report)完整案例:电商价格监控系统
把上面的知识串起来,做一个实际的数据产品:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 爬虫采集 │────▶│ 数据清洗 │────▶│ 存入MySQL │
│ (Scrapy) │ │ (Pandas) │ │ │
└─────────────┘ └─────────────┘ └──────┬──────┘
│
┌───────────────────────────────────────┘
▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 定时分析 │────▶│ 生成报表 │────▶│ 邮件推送 │
│ (APScheduler)│ │ (openpyxl) │ │ (smtplib) │
└─────────────┘ └─────────────┘ └─────────────┘
│
▼
┌─────────────┐
│ API服务 │────▶ 供前端/小程序调用
│ (FastAPI) │
└─────────────┘产出物:
- 每日价格变动报表(自动发邮件)
- 历史价格查询API
- 降价提醒推送
总结
| 阶段 | 核心问题 | 关键技能 |
|---|---|---|
| 采集 | 数据从哪来 | 爬虫、API对接 |
| 清洗 | 数据质量差 | Pandas、正则 |
| 存储 | 数据放哪里 | 数据库选型 |
| 分析 | 数据说明什么 | 统计、可视化、ML |
| 产品 | 数据怎么用 | API、报表、大屏 |
一句话总结:爬虫是手段,清洗是基础,存储是保障,分析是核心,产品是目的。
别只会爬数据,要学会让数据产生价值。
参考资源
- 🔗 Scrapy官方文档
- 🔗 FastAPI官方文档
- 🔗 Pandas官方文档
- 📖 《Python网络爬虫权威指南》
- 📖 《数据产品经理修炼手册》
数据千万条,合规第一条。爬虫不规范,牢饭吃到饱。 🐛