Files
spider/cmd/vogue.go
toom1996 934a8961b0 fix: 抓取前预检已入库的秀,避免重复下载(重爬 62 分钟 0 新增)
问题:图片 key 是内容 sha1,不下载就无法判断是否已存在;
后端又没存 source_url,无法做 URL 级判重。
于是每次重爬都把几百张已下过的图再下一遍 —— 线上实测
Celine 跑了 62 分钟、约 600MB,入库 0 新增。

修复:
- 后端新增 GET /admin/internal/shows/covered?brand_uid=
  按 (年份, 季节, 类型) 聚合已入库图片张数
- spider 抓取前预检,整场已入库(>=10 张)就跳过,一张图都不下载
- 加 --force 可强制重抓(默认跳过)
- 媒体直传并发改为全进程共享信号量:此前秀级 2 × 每场 6 = 12 路
  同时打 Vogue,被限流后单张从 9.8s 掉到 ~90s
- 批次下载失败时打印第一条错误(此前只统计个数,查不出原因)
2026-10-25 20:07:54 +08:00

51 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cmd
import (
"github.com/spf13/cobra"
"my-spiders/internal/config"
"my-spiders/internal/media"
"my-spiders/internal/spider"
)
var (
brandID int64
maxCo int
maxShows int
forceAll bool // --force:忽略「已入库」预检,强制重抓
)
var vogueCmd = &cobra.Command{
Use: "vogue",
Short: "启动 Vogue 时装发布会采集器",
Run: func(cmd *cobra.Command, args []string) {
// 1. 修复参数数量 & 类型强转 uint(brandID)
vogueSpider := spider.NewVogueSpider(maxCo, uint(brandID), maxShows, IngestClient)
// 媒体机直传:由 spider 下载并上传图片,后端只写库(config.media.upload 控制)。
if config.GlobalConfig.Media.Upload && IngestClient != nil {
vogueSpider.Media = media.New(IngestClient, "runway", config.GlobalConfig.Media.Concurrency)
}
// --force:跳过「已入库的秀」预检,强制重抓(默认跳过,避免重复下载)。
vogueSpider.Force = forceAll
// 2. 修复方法名:将 Execute() 改为 Run()
vogueSpider.Run()
},
}
func init() {
rootCmd.AddCommand(vogueCmd)
// 绑定命令行参数
vogueCmd.Flags().Int64VarP(&brandID, "brand", "b", 0, "指定抓取的品牌 ID")
// 修复:将 "c" 改为 "m"(或者 ""),避免与全局的 -c 参数冲突
vogueCmd.Flags().IntVarP(&maxCo, "max-co", "m", 5, "最大并发数限制")
// 小批量试爬:仅抓取单个品牌的前 N 场发布会(0=不限制)。用于控制入库量 / 先看效果。
vogueCmd.Flags().IntVarP(&maxShows, "max-shows", "s", 0, "单个品牌最多抓取的发布会场次(0=不限制,小批量试爬用)")
// 默认跳过已入库的秀(省带宽);确需刷新元数据时加 --force。
vogueCmd.Flags().BoolVarP(&forceAll, "force", "f", false, "忽略「已入库」预检,强制重抓全部场次")
}