搜 索

从爬虫到数据产品

  • 33阅读
  • 2022年05月21日
  • 0评论
首页 / 爬虫/工具 / 正文

前言

每个数据产品的背后,都有一个不为人知的爬虫在默默付出。

这篇文章将带你走完数据的一生:从互联网的犄角旮旯把它抓回来,洗干净,存起来,分析它,最后包装成一个能赚钱(或者能交差)的数据产品。

完整链路:爬虫采集 → 数据清洗 → 数据存储 → 数据分析 → 产品输出


第一章:爬虫采集 —— 数据的起点

爬虫三件套

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
非结构化灵活schemaMongoDB
向量检索语义搜索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
数据大屏展厅装XECharts / DataV
小程序/AppC端用户前端框架

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、报表、大屏

一句话总结:爬虫是手段,清洗是基础,存储是保障,分析是核心,产品是目的。

别只会爬数据,要学会让数据产生价值。


参考资源


数据千万条,合规第一条。爬虫不规范,牢饭吃到饱。 🐛

评论区
暂无评论
avatar