多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

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

图片采集回来一堆图怎么挑?按 domain 和 source 做选源 图片采集回来一堆图,怎么挑?按 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 BASEhttps://api.serpbase.devHEADERS{X-API-Key:YOUR_API_KEY,Content-Type:application/json}# 我自己的域名分档,按业务需求改,别照抄BLOCKED{pinterest.com,huaban.com}# 强防盗链或重水印LOW_PRI{baike.baidu.com,zhihu.com}# 转载多、原图少defcollect(query,pages2):rows[]forpageinrange(1,pages1):body{q:query,hl:zh,gl:cn,page:page}rrequests.post(f{BASE}/google/image/search,headersHEADERS,jsonbody,timeout30)payloadr.json()ifpayload.get(status)!0:print(fpage{page}status{payload.get(status)})continueforitinpayload.get(images)or[]:ifnotit.get(image_url):continue# 没直链的记录对选图无意义domit.get(domain)orrows.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:dr[domain].lower()ifdinBLOCKED:c.append(r)elifdinLOW_PRI:b.append(r)elifd:a.append(r)else:c.append(r)# 没有 domain 的,一律降档returna,b,c三个设计点:没有domain的降档处理。这个字段是可选的,拿不到很常见。缺信息的时候不能当成没问题,我按最保守的方式处理——降档,宁可多看几张也别用错图。image_url必须存在。这条不成立的记录用于展示都没戏,直接丢,不进下游。黑白名单放脚本外面,按业务改。分档标准是业务判断,不是技术判断。我做电商选品要的是原图和可以商用的来源,你做舆情监控可能正相反——那黑白名单就得反过来配。三、先跑统计,再定名单别凭空列黑名单。第一次跑完先看分布:defdomain_report(rows,top15):cntCounter(r[domain]forrinrowsifr[domain])totallen(rows)print(frecords{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 个域名占多少。超过一半,你的筛选就该从逐张看改成按域名排;低于三成,说明结果分散,逐张看反而更省事。看完这个分布再决定策略,比上来就写黑名单靠谱。
返回列表