AI 时代的数据工程师 :从隧道代理抓取到向量数据库存储的全闭环实战

0 阅读4分钟

在 2026 年,单纯抓取网页 HTML 已经没有意义了。真正的价值在于将这些数据转化为向量(Embedding)并存入向量数据库,构建属于你自己的 RAG(检索增强生成)系统。

今天,我们将升级数据管道,实现“高效抓取 -> 自动清洗 -> 向量存储”的一体化流程。

升级版工具箱

  1. 代理服务:隧道代理(解决封禁与高成本)。
  2. 数据清洗BeautifulSoup + re(去除噪音)。
  3. 向量数据库Milvus (使用 pymilvus 及其内置的轻量化模式)。
  4. Embedding 模型Sentence-Transformers(将文本转为坐标)。
pip install requests beautifulsoup4 pymilvus sentence-transformers

核心代码实现:全自动化 AI 数据工厂

下面这段代码展示了如何利用隧道代理突破反爬限制,并迅速将数据入库。

import requests
import re
import random
from bs4 import BeautifulSoup
from pymilvus import MilvusClient, model

# ==========================================
# 1. 配置信息 (代理与数据库)
# ==========================================
# 亿牛云爬虫代理配置
PROXY_DOMAIN = "PROXY.16yun.cn"
PROXY_PORT   = "6447"
PROXY_USER   = "16YUN_USER"
PROXY_PASS   = "16YUN_PASS"

# 初始化 Milvus Lite (本地轻量化向量数据库)
milvus_client = MilvusClient("ai_data_factory.db")
COLLECTION_NAME = "web_knowledge_base"

# 初始化嵌入模型 (用于将文本转为向量)
embedding_fn = model.DefaultEmbeddingFunction()

def setup_db():
    """初始化向量库集合"""
    if milvus_client.has_collection(COLLECTION_NAME):
        milvus_client.drop_collection(COLLECTION_NAME)
    milvus_client.create_collection(
        collection_name=COLLECTION_NAME,
        dimension=768  # 默认模型维度
    )
    print(f"[√] 向量库 {COLLECTION_NAME} 初始化成功")

# ==========================================
# 2. 带有代理保护的抓取函数
# ==========================================
def fetch_and_clean(url):
    """
    使用隧道代理抓取并清洗数据
    """
    proxy_meta = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_DOMAIN}:{PROXY_PORT}"
    proxies = {"http": proxy_meta, "https": proxy_meta}
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AI-Data-Engineer/1.0",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    }

    try:
        print(f"[*] 正在通过代理请求: {url}")
        # 使用隧道代理发起请求,自动切换出口IP
        response = requests.get(url, headers=headers, proxies=proxies, timeout=15)
        
        if response.status_code == 200:
            # --- 数据清洗逻辑 ---
            soup = BeautifulSoup(response.text, 'html.parser')
            
            # 移除脚本、样式、导航栏等噪音
            for script_or_style in soup(["script", "style", "nav", "footer", "header"]):
                script_or_style.decompose()
            
            # 获取纯文本并去除多余空行
            text = soup.get_text()
            clean_text = re.sub(r'\n+', '\n', text).strip()
            
            print(f"[√] 成功抓取并清洗数据,长度: {len(clean_text)} 字符")
            return clean_text
            
    except Exception as e:
        print(f"[-] 抓取失败: {e}")
    return None

# ==========================================
# 3. 向量化与入库
# ==========================================
def save_to_vector_db(text, url):
    """
    将清洗后的文本向量化并存入 Milvus
    """
    if not text or len(text) < 50:
        return

    # 简单切片:将长文本切成 500 字的小块,方便 AI 检索
    chunks = [text[i:i+500] for i in range(0, len(text), 500)]
    
    # 转换为向量
    vectors = embedding_fn.encode_documents(chunks)
    
    # 构造入库数据
    data = [
        {"id": i, "vector": vectors[i], "text": chunks[i], "source": url}
        for i in range(len(chunks))
    ]
    
    # 插入数据库
    milvus_client.insert(collection_name=COLLECTION_NAME, data=data)
    print(f"[√] 已将 {len(chunks)} 条切片存入向量数据库")

# ==========================================
# 4. 主程序运行
# ==========================================
if __name__ == "__main__":
    # 初始化环境
    setup_db()
    
    # 模拟抓取任务 (这里可以替换为你的目标 AI 新闻站或技术文档)
    target_urls = [
        "https://www.example.com/ai-news-1",
        "http://httpbin.org/ip"  # 仅做代理测试
    ]
    
    for url in target_urls:
        content = fetch_and_clean(url)
        if content:
            save_to_vector_db(content, url)
    
    # 尝试检索:模拟 AI 提问
    print("\n[*] 模拟 RAG 检索测试...")
    search_res = milvus_client.search(
        collection_name=COLLECTION_NAME,
        data=[embedding_fn.encode_queries(["最新的 AI 动态是什么?"])][0],
        limit=1,
        output_fields=["text", "source"]
    )
    
    for hit in search_res[0]:
        print(f"找到最相关内容: {hit['entity']['text'][:100]}...")
        print(f"来源: {hit['entity']['source']}")

关键技术点解析

1. 为什么代码中不写“IP 切换”逻辑?

因为我们使用了隧道代理。普通的代理 IP 池需要你手动去维护 requests.get(proxies=random.choice(ips)),而隧道代理在云端自动完成了负载均衡和 IP 轮换。你的代码只需要像连接单个代理一样简单,剩下的“脏活累活”全由代理服务器在后台搞定。

2. 低成本的秘密:Milvus Lite

在开发阶段或小型项目中,不需要部署沉重的 Docker 容器。代码中使用的 MilvusClient("ai_data_factory.db") 会在本地生成一个 SQLite 样式的数据库文件,这极大降低了硬件成本。

3. 数据清洗的重要性

AI 模型最讨厌 HTML 标签中的 <div><span> 或 JavaScript 代码。通过 BeautifulSoupdecompose() 方法剔除噪音,不仅能节省向量数据库的存储空间,还能显著提高 Embedding 的准确率。

结语

从 2026 年的视角来看,一个优秀的采集方案必须具备“数据全周期管理”的能力。通过隧道代理保证稳定的输入,再通过向量数据库完成知识的沉淀,你不仅是在写代码,更是在为 AI 时代构建基础设施。