在电商时代,图片搜索已经成为用户发现商品的重要方式。作为开发者,我经常需要为客户批量搜索相似商品并生成报告。手动操作不仅效率低下,还容易出错。于是,我决定开发一个自动化系统来解决这个问题。
项目目标#
- 批量处理图片搜索
- 自动提取商品数据
- 生成包含图片的Excel报告
- 自动发送邮件通知
- 完整的错误处理和日志记录
技术选型#
自动化框架:DrissionPage#
经过对比Selenium、Playwright等框架,我选择了DrissionPage:
- 专为中国网站优化
- 反爬虫能力强
- 对淘宝等国内电商支持好
数据拦截:mitmproxy#
- 能够拦截HTTPS流量
- 支持自定义插件
- 适合API数据提取
数据处理#
- Pandas:数据处理
- openpyxl:Excel操作
- Pillow:图片处理
核心功能实现#
1. 图片搜索自动化#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| 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响应,提取商品信息:
1
2
3
4
5
6
7
| 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文件,包含压缩图片:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 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文件过大的问题:
1
2
3
4
5
6
7
8
9
10
11
| 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框架
- 设置随机延迟
- 模拟真实用户行为
1
2
3
4
5
6
| # 随机延迟模拟人类行为
import random
time.sleep(random.uniform(1, 3))
# 滚动页面
self.browser.scroll_to_bottom()
|
2. 图片上传处理#
问题:淘宝使用隐藏的file input
解决方案:
- 使用JavaScript直接设置文件路径
- 监听上传进度事件
1
2
3
| # 直接设置文件路径
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结构
- 使用多种字段别名匹配
- 建立数据质量评分
1
2
3
4
5
6
7
8
9
10
11
12
| 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 - 配置简单:只需配置邮件信息
- 日志详细:完整的执行日志
项目结构#
1
2
3
4
5
6
7
8
9
10
| 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界面、实时进度显示
- 增强稳定性:更完善的错误处理
这个项目从需求分析到最终实现,经历了完整的产品开发周期。通过合理的技术选型、模块化的架构设计和完善的错误处理,最终实现了一个稳定可靠的自动化系统。
最大的挑战是反爬虫对抗和数据解析的复杂性,通过不断调试和优化,最终找到了有效的解决方案。
这个项目不仅解决了实际的业务问题,也让我在自动化测试、数据处理、系统架构等方面有了更深入的理解和实践经验。