☰
图片采集回来一堆图怎么挑?按 domain 和 source 做选源
2026/10/8 6:46:37 网站建设 项目流程

图片采集回来一堆图,怎么挑?按 domain 和 source 做选源

用图片搜索 API 采集竞品素材,一次能拿回来几十条记录。问题是:这些图质量参差不齐,直接拿来用会翻车——有水印的、有锯齿的、有来自不该引用的站点的。

我上次帮一个做电商选品的朋友筛图,他的做法是存下来之后人眼翻,五百张图翻一下午。后来改成在采集时就用domain和source字段做初筛,人眼只需要看最后二十来张。

这篇讲这个筛选层怎么写,以及我对那两个字段可靠性的实测判断。

一、字段口径:哪些一定能拿到

图片端点的返回字段里,必填的只有rank、link、image_url三个。其他都是可选的:

字段必填作用
rank是排名位次
link是图片来源页面
image_url是图片直链
title否图标题
position否rank 的别名
thumbnail_url / thumbnail否缩略图,互為别名
source否来源标签
domain否来源页面域名

注意thumbnail_url和thumbnail是同一个东西的两种写法,别当成两个字段存两遍。我第一次接入时就存重了,白占一列。

二、选源脚本:按 domain 分档

importcsv,requestsfromcollectionsimportCounter,defaultdict BASE="https://api.serpbase.dev"HEADERS={"X-API-Key":"YOUR_API_KEY","Content-Type":"application/json"}# 我自己的域名分档,按业务需求改,别照抄BLOCKED={"pinterest.com","huaban.com"}# 强防盗链或重水印LOW_PRI={"baike.baidu.com","zhihu.com"}# 转载多、原图少defcollect(query,pages=2):rows=[]forpageinrange(1,pages+1):body={"q":query,"hl":"zh","gl":"cn","page":page}r=requests.post(f"{BASE}/google/image/search",headers=HEADERS,json=body,timeout=30)payload=r.json()ifpayload.get("status")!=0:print(f"page{page}status={payload.get('status')}")continueforitinpayload.get("images")or[]:ifnotit.get("image_url"):continue# 没直链的记录对选图无意义dom=it.get("domain")or""rows.append({"rank":it.get("rank"),"title":it.get("title"),"page_url":it.get("link"),"image_url":it["image_url"],"domain":dom,"source":it.get("source"),})returnrowsdeftier(rows):"""按域名把图片分三档。"""a,b,c=[],[],[]forrinrows:d=r["domain"].lower()ifdinBLOCKED:c.append(r)elifdinLOW_PRI:b.append(r)elifd:a.append(r)else:c.append(r)# 没有 domain 的,一律降档returna,b,c

三个设计点:

  1. 没有domain的降档处理。这个字段是可选的,拿不到很常见。缺信息的时候不能当成"没问题",我按最保守的方式处理——降档,宁可多看几张也别用错图。
  2. image_url必须存在。这条不成立的记录用于展示都没戏,直接丢,不进下游。
  3. 黑白名单放脚本外面,按业务改。分档标准是业务判断,不是技术判断。我做电商选品要的是原图和可以商用的来源,你做舆情监控可能正相反——那黑白名单就得反过来配。

三、先跑统计,再定名单

别凭空列黑名单。第一次跑完先看分布:

defdomain_report(rows,top=15):cnt=Counter(r["domain"]forrinrowsifr["domain"])total=len(rows)print(f"records={total}with_domain={sum(cnt.values())}")fordom,nincnt.most_common(top):print(f"{dom:<28}{n:>4}({n/total:.0%})")

我朋友那次跑出来,前 5 个域名占了 62% 的结果,其中两个是聚合站和图片站。这个数字直接告诉他:与其一张张筛,不如先把这两个域名整片排掉,效率差一个数量级。

同时with_domain / total这个比例也值得看。如果低于七成,说明domain这个字段在这个查询上不太可靠,你的分档会误杀一批——那就得退回到按source标签做粗筛,或者干脆按link的 URL 自己抽域名。

四、source 和 domain 不一致时信谁

实测中我发现source和domain有时对不上:source 写的是站点中文名,domain 给的是另一个域名。这种记录通常是转采。

我的规则是:判定可信度只认domain。因为source是标签性质的展示值,不保证和link的来源一致;而domain按文档描述就是来源页面的域名。需要展示来源名时用source,做黑白名单判定时用domain,两者用途分开。

五、成本账

image/search是 2 credits 一次,比普通搜索贵一倍。所以筛选这件事必须在采集时顺便做,不能采完再删:每条记录的字段已经在响应里了,本地筛是零成本的;但如果想法是"多采几页总能碰到好图",那就等于为 30% 的可用率付全价。

我的做法是一次采 2 页(20 条左右),筛完如果 A 档不足 5 张再补第 3 页,并且只对确实稀缺的查询补——多数情况 2 页就够了。

字段口径和参数我是按 SerpBase 的图片端点文档 核对的:必填rank/link/image_url,thumbnail_url与thumbnail为可选别名,费率 2 credits 一次。

六、下一步

拿你现在在采的图片查询跑一次domain_report,看前 5 个域名占多少。超过一半,你的筛选就该从"逐张看"改成"按域名排";低于三成,说明结果分散,逐张看反而更省事。看完这个分布再决定策略,比上来就写黑名单靠谱。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询