在 2026 年,单纯抓取网页 HTML 已经没有意义了。真正的价值在于将这些数据转化为向量(Embedding)并存入向量数据库,构建属于你自己的 RAG(检索增强生成)系统。
今天,我们将升级数据管道,实现“高效抓取 -> 自动清洗 -> 向量存储”的一体化流程。
升级版工具箱
- 代理服务:隧道代理(解决封禁与高成本)。
- 数据清洗:
BeautifulSoup+re(去除噪音)。 - 向量数据库:
Milvus(使用pymilvus及其内置的轻量化模式)。 - 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 代码。通过 BeautifulSoup 的 decompose() 方法剔除噪音,不仅能节省向量数据库的存储空间,还能显著提高 Embedding 的准确率。
结语
从 2026 年的视角来看,一个优秀的采集方案必须具备“数据全周期管理”的能力。通过隧道代理保证稳定的输入,再通过向量数据库完成知识的沉淀,你不仅是在写代码,更是在为 AI 时代构建基础设施。