我用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/                    # 数据目录

使用方法

  1. 准备图片:将图片放入IMG_LIST目录
  2. 配置邮件:编辑config/email_config.json
  3. 一键运行python run.py
  4. 查看结果:Excel文件在data/exports/目录

技术总结

收获

  1. 自动化框架选择:DrissionPage在反爬虫方面表现优秀
  2. 数据拦截技术:mitmproxy是API数据提取的有效方案
  3. 图片处理优化:合理的压缩策略能显著减小文件大小
  4. 工作流程设计:模块化设计便于维护和扩展

价值

  • 效率提升:从手动操作到全自动化,效率提升10倍
  • 质量保证:自动化处理减少人为错误
  • 可扩展性:模块化设计便于功能扩展

未来优化

  1. 支持更多平台:扩展到京东、拼多多等
  2. 增加数据分析:价格趋势分析、竞品对比
  3. 优化用户体验:Web界面、实时进度显示
  4. 增强稳定性:更完善的错误处理

结语

这个项目从需求分析到最终实现,经历了完整的产品开发周期。通过合理的技术选型、模块化的架构设计和完善的错误处理,最终实现了一个稳定可靠的自动化系统。

最大的挑战是反爬虫对抗和数据解析的复杂性,通过不断调试和优化,最终找到了有效的解决方案。

这个项目不仅解决了实际的业务问题,也让我在自动化测试、数据处理、系统架构等方面有了更深入的理解和实践经验。