我用Python开发了一个淘宝图片搜索自动化系统
Posted on Mon 26 May 2025 in 开发工具
在电商时代,图片搜索已经成为用户发现商品的重要方式。作为开发者,我经常需要为客户批量搜索相似商品并生成报告。手动操作不仅效率低下,还容易出错。于是,我决定开发一个自动化系统来解决这个问题。
项目目标
- 批量处理图片搜索
- 自动提取商品数据
- 生成包含图片的Excel报告
- 自动发送邮件通知
- 完整的错误处理和日志记录
技术选型
自动化框架:DrissionPage
经过对比Selenium、Playwright等框架,我选择了DrissionPage: - 专为中国网站优化 - 反爬虫能力强 - 对淘宝等国内电商支持好
数据拦截:mitmproxy
- 能够拦截HTTPS流量
- 支持自定义插件
- 适合API数据提取
数据处理
- Pandas:数据处理
- openpyxl:Excel操作
- Pillow:图片处理
核心功能实现
1. 图片搜索自动化
def search_by_image(self, image_path: str):
"""图片搜索功能"""
# 1. 打开淘宝首页
self.browser.get('https://www.taobao.com')
# 2. 点击搜同款按钮
search_button = self.browser.ele('css:.image-search-icon-wrapper')
search_button.click()
# 3. 上传图片
file_input = self.browser.ele('css:#image-search-custom-file-input')
file_input.input(image_path)
# 4. 等待上传完成并搜索
self._wait_for_upload_complete()
search_btn = self.browser.ele('css:#image-search-upload-button')
search_btn.click()
# 5. 提取商品数据
return self._extract_products_from_page()
2. 数据拦截与提取
通过mitmproxy拦截淘宝API响应,提取商品信息:
def response(flow: http.HTTPFlow) -> None:
"""拦截API响应"""
if 'h5api.m.taobao.com' in flow.request.pretty_url:
content = flow.response.text
# 解析JSONP响应,提取商品数据
data = parse_jsonp_response(content)
save_to_file(data)
3. Excel报告生成
生成多Sheet的Excel文件,包含压缩图片:
def generate_excel_report(self, products_data):
"""生成Excel报告"""
workbook = openpyxl.Workbook()
for sheet_data in products_data:
worksheet = workbook.create_sheet(sheet_data['name'])
# 添加商品数据
self.add_product_data(worksheet, sheet_data['products'])
# 下载并添加商品图片
self.add_product_images(worksheet, sheet_data['products'])
workbook.save('report.xlsx')
4. 图片压缩优化
解决Excel文件过大的问题:
def compress_image(self, image_path: str) -> str:
"""智能图片压缩"""
with Image.open(image_path) as img:
# 调整尺寸到400x400
if img.width > 400 or img.height > 400:
img.thumbnail((400, 400), Image.Resampling.LANCZOS)
# 压缩质量到40%
img.save(compressed_path, "JPEG", quality=40, optimize=True)
return compressed_path
技术难点与解决方案
1. 反爬虫对抗
问题:淘宝有完善的反爬虫机制
解决方案: - 使用DrissionPage框架 - 设置随机延迟 - 模拟真实用户行为
# 随机延迟模拟人类行为
import random
time.sleep(random.uniform(1, 3))
# 滚动页面
self.browser.scroll_to_bottom()
2. 图片上传处理
问题:淘宝使用隐藏的file input
解决方案: - 使用JavaScript直接设置文件路径 - 监听上传进度事件
# 直接设置文件路径
file_input = self.browser.ele('css:#image-search-custom-file-input')
self.browser.run_js(f"arguments[0].value = '{image_path}'", file_input)
3. 数据解析复杂性
问题:淘宝API返回JSONP格式,结构复杂
解决方案: - 递归解析JSON结构 - 使用多种字段别名匹配 - 建立数据质量评分
def find_items_recursively(self, obj):
"""递归查找商品数据"""
if isinstance(obj, dict) and self._is_product_item(obj):
return [self._extract_product_info(obj)]
if isinstance(obj, list):
for item in obj:
result = self.find_items_recursively(item)
if result:
return result
return []
项目成果
功能实现
- ✅ 批量图片搜索(15张图片/批次)
- ✅ 自动数据提取和解析
- ✅ 多Sheet Excel报告生成
- ✅ 邮件自动发送
- ✅ 数据自动清理
性能指标
- 处理速度:15张图片约3分钟
- 文件大小:从326MB压缩到16MB
- 成功率:95%以上
- 稳定性:支持错误重试
用户体验
- 一键运行:
python run.py - 配置简单:只需配置邮件信息
- 日志详细:完整的执行日志
项目结构
taobao-search/
├── run.py # 主启动脚本
├── src/ # 源代码
│ ├── automation/ # 自动化模块
│ ├── email/ # 邮件服务
│ ├── excel/ # Excel处理
│ └── workflow/ # 工作流程
├── config/ # 配置文件
├── IMG_LIST/ # 图片目录
└── data/ # 数据目录
使用方法
- 准备图片:将图片放入
IMG_LIST目录 - 配置邮件:编辑
config/email_config.json - 一键运行:
python run.py - 查看结果:Excel文件在
data/exports/目录
技术总结
收获
- 自动化框架选择:DrissionPage在反爬虫方面表现优秀
- 数据拦截技术:mitmproxy是API数据提取的有效方案
- 图片处理优化:合理的压缩策略能显著减小文件大小
- 工作流程设计:模块化设计便于维护和扩展
价值
- 效率提升:从手动操作到全自动化,效率提升10倍
- 质量保证:自动化处理减少人为错误
- 可扩展性:模块化设计便于功能扩展
未来优化
- 支持更多平台:扩展到京东、拼多多等
- 增加数据分析:价格趋势分析、竞品对比
- 优化用户体验:Web界面、实时进度显示
- 增强稳定性:更完善的错误处理
结语
这个项目从需求分析到最终实现,经历了完整的产品开发周期。通过合理的技术选型、模块化的架构设计和完善的错误处理,最终实现了一个稳定可靠的自动化系统。
最大的挑战是反爬虫对抗和数据解析的复杂性,通过不断调试和优化,最终找到了有效的解决方案。
这个项目不仅解决了实际的业务问题,也让我在自动化测试、数据处理、系统架构等方面有了更深入的理解和实践经验。