- 产品持久化:每完成一个产品立即追加写入 products_pending.jsonl,崩溃不丢已完成产品,finish 读盘合并后统一写模板 - 503 致命错误提前终止:compose/product/seed_shot 端到端识别,提前终止搜索分析,丢弃未完成简报,保留已完成落盘产品直接合成模板 - 模特分配:material_library 合格模特图按任务序号独立随机,同 SPU 多款不再共用同一模特 - 图像网关适配:execution_mode/background 默认不再传入 yunfei 等标准网关,base_url 需带 /v1;429/5xx/空响应退避重试 - Pinterest 分析:删除 term 注入与纯文本降级,失败直接放弃;图片上传前 PIL 完整性校验;suitable_for_print=False 过滤丢弃 - 模板导出:不再产生空白 xlsx,文件名=模板原文件名_已填写;写入前按货号末 3 位升序排序 - 删除对接文档.md,更新 README,gitignore 排除测试产物
53 lines
2.3 KiB
Python
53 lines
2.3 KiB
Python
"""Pinterest 爬取封装:把 pinterest_image_capture 的 CLI 逻辑封装成可调用函数,供 UI/节点后台线程调用。
|
|
|
|
用法:
|
|
from pinterest_scraper.scraper import scrape_pinterest
|
|
files = scrape_pinterest("vintage 70s", count=40, save_dir="output/pinterest_ref/US/vintage_70s")
|
|
"""
|
|
import asyncio
|
|
import os
|
|
from pathlib import Path
|
|
from typing import List, Optional
|
|
|
|
from pinterest_scraper.pinterest_image_capture import (
|
|
detect_proxy,
|
|
download_all,
|
|
get_system_proxy,
|
|
scrape,
|
|
)
|
|
|
|
|
|
def scrape_pinterest(keyword: str, count: int = 40, save_dir: Optional[str] = None,
|
|
proxy: Optional[str] = None, headless: bool = False,
|
|
cdp_url: Optional[str] = None,
|
|
login_wait: bool = False) -> List[str]:
|
|
"""按关键词爬取 Pinterest 图片并下载到 save_dir,返回下载成功的文件路径列表。
|
|
|
|
- proxy 为 None 时自动探测(环境变量/系统代理/本地常见端口);空字符串显式禁用。
|
|
- login_wait=False(默认):运行时检测到未登录时不阻塞,直接返回空列表(由调用方跳过并告警);
|
|
login_wait=True:弹出 Chrome 窗口等待手动登录一次,登录态缓存在
|
|
pinterest_scraper/.chrome_session,之后自动复用。
|
|
"""
|
|
# 代理解析:显式传入 > 自动探测 > 直连
|
|
if proxy is None:
|
|
proxy = detect_proxy() or get_system_proxy()
|
|
if proxy:
|
|
print(f"[pinterest] 使用代理: {proxy}")
|
|
else:
|
|
print("[pinterest] 未检测到代理,将直连(如无法访问请手动指定代理)")
|
|
proxy = proxy or None
|
|
|
|
out = save_dir or os.path.join(os.getcwd(), "output", "img", keyword)
|
|
os.makedirs(out, exist_ok=True)
|
|
print(f"[pinterest] 关键词: {keyword} | 数量: {count} | 保存目录: {out}")
|
|
|
|
imgs_url = asyncio.run(scrape(keyword, count, headless, proxy, cdp_url, login_wait))
|
|
if not imgs_url:
|
|
print(f"[pinterest] 未收集到图片(可能未登录或搜索无结果): {keyword}")
|
|
return []
|
|
asyncio.run(download_all(imgs_url, out, proxy))
|
|
|
|
files = [str(p) for p in sorted(Path(out).iterdir()) if p.is_file()]
|
|
print(f"[pinterest] 完成,共下载 {len(files)} 张图片: {keyword}")
|
|
return files
|