LangChain Go 网页爬虫学习案例
这是一个使用 LangChain Go 构建的智能网页爬虫项目,展示了如何结合网页爬取和 AI 分析功能。
🚀 项目特性
- 智能内容提取: 使用 goquery 库精确提取网页核心内容
- AI 驱动分析: 集成 OpenAI GPT 模型进行内容分析和总结
- 批量处理: 支持批量爬取多个网页
- 数据持久化: 将结果保存为 JSON 格式
- 友好输出: 提供详细的进度显示和结果摘要
📁 项目结构
langchain_scraper/
├── cmd/ # 主程序目录
│ ├── basic.go # 基础爬虫示例
│ ├── batch.go # 批量爬虫
│ └── enhanced.go # 增强版爬虫
├── pkg/ # 包目录
│ └── scraper/ # 爬虫工具包
│ ├── utils.go # 工具函数
│ └── utils_test.go # 测试文件
├── go.mod # Go 模块定义
├── .env.example # 环境变量模板
├── Makefile # 构建脚本
└── README.md # 项目说明
🛠️ 安装和设置
1. 安装依赖
go mod tidy
2. 设置 OpenAI API Key
复制环境变量模板:
cp .env.example .env
编辑 .env 文件,添加你的 OpenAI API Key:
OPENAI_API_KEY=your_actual_api_key_here
📖 使用说明
基础爬虫示例
运行基础爬虫,爬取默认网页(golang.org):
make run-basic
# 或直接运行
go run cmd/basic.go
爬取指定网页:
make run-basic-url
# 或直接运行
go run cmd/basic.go https://example.com
高级批量爬虫
运行批量爬虫,爬取默认网页列表:
make run-batch
# 或直接运行
go run cmd/batch.go
爬取自定义网页列表:
make run-batch-urls
# 或直接运行
go run cmd/batch.go https://golang.org https://pkg.go.dev https://go.dev/blog
增强版智能爬虫
运行增强版爬虫:
make run-enhanced
# 或直接运行
go run cmd/enhanced.go
爬取自定义网页:
make run-enhanced-urls
# 或直接运行
go run cmd/enhanced.go https://golang.org https://pkg.go.dev
🎯 功能演示
1. 基础爬虫功能
- 爬取网页内容
- 提取标题和主要文本
- AI 内容总结
- 智能问答
2. 批量爬虫功能
- 批量处理多个 URL
- 智能延迟避免被封
- 结构化数据输出
- JSON 格式结果保存
📊 输出示例
控制台输出
🚀 LangChain Go 网页爬虫学习案例
===============================
📖 正在爬取网页: https://golang.org/
✅ 成功爬取内容,共 2847 字符
📝 部分原始内容:
================
标题: The Go Programming Language
🤖 正在使用 AI 分析内容...
📊 AI 内容总结:
===============
Go 是 Google 开发的开源编程语言,专注于简洁性、可靠性和效率...
❓ 回答问题: 这个网站主要介绍什么?有什么特色功能?
=================================
🤖 AI 回答:
这个网站主要介绍 Go 编程语言...
JSON 输出格式
[
{
"url": "https://golang.org/",
"title": "The Go Programming Language",
"content": "网页内容文本...",
"summary": "AI 生成的内容摘要",
"keywords": ["Go", "编程语言", "Google"],
"timestamp": "2024-01-01T12:00:00Z",
"word_count": 1234
}
]
🔧 自定义配置
修改请求延迟
在 batch_scraper.go 中修改延迟时间:
// 创建批量爬虫(每次请求间隔 5 秒)
scraper, err := NewBatchScraper(5)
更换 AI 模型
在代码中修改模型配置:
llm, err := openai.New(
openai.WithToken(apiKey),
openai.WithModel("gpt-4"), // 使用 GPT-4
)
自定义内容提取规则
修改 CSS 选择器来提取特定内容:
// 只提取文章内容
doc.Find("article p, .content p").Each(func(i int, s *goquery.Selection) {
// 处理逻辑
})
🚨 注意事项
- API 费用: 使用 OpenAI API 会产生费用,请合理控制调用次数
- 请求频率: 批量爬取时建议设置适当延迟,避免被目标网站封锁
- 内容长度: 长文本会被截断以适应 AI 模型的 token 限制
- 网站政策: 请遵守目标网站的 robots.txt 和使用条款
🎓 学习要点
LangChain Go 集成
- 如何初始化和配置 LLM 客户端
- 消息格式和上下文管理
- 错误处理最佳实践
网页爬取技术
- HTTP 客户端配置和优化
- HTML 解析和内容提取
- 批量处理和并发控制
数据处理
- 结构化数据建模
- JSON 序列化和存储
- 结果分析和可视化
🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
📝 许可证
MIT License