怎么检测远程图片(大量)存不存在?

2022-12-10 18:55:32 +08:00
 tellmeworld

网站里面大量引用了微博的图片,但是有些图片不断失效,导致图片无法显示;

用 curl ( PHP )抓取远程内容或者响应代码,抓不到;

想全部下载到本地,然后比对数据库和没有下载成功的图片,然后删掉,于是用了:

用浏览器图片下载插件,下载个一两万个之后全部错误;

甚至用迅雷批量下载也是,下载个几千个之后卡死。

还有啥办法?

2632 次点击
所在节点    程序员
10 条回复
needpp
2022-12-10 19:03:12 +08:00
curl -I xxx 只返回 head 信息
chenwenzhang
2022-12-10 19:39:04 +08:00
是不是请求头部少个 Referer 的原因
iOCZ
2022-12-10 20:02:43 +08:00
一楼正解
we21x
2022-12-10 20:36:24 +08:00
```python
for img in img_list:
r = requests.head(img)
if r.status == 200:
print('图片存在')
```
用 head 请求看状态码是不是 200
learningman
2022-12-10 20:38:15 +08:00
自己手写个下载器,限频换 IP 呗
CEBBCAT
2022-12-10 23:29:53 +08:00
曹国伟:淦
---
你可以基于楼上提到的 HTPP HEAD 原理,构建一个分布或单体爬虫,对被删掉的照片做标记。你也可以在网页里面加入代码,图片加载失败后 POST 上报给你,你再决定要不要去爬。

直接下载的方式浪费带宽,耗时更久,学习一点 HTTP 知识想必可以帮你很多。
bjzhush
2022-12-10 23:33:33 +08:00
我告诉你个可行的办法,是我多年前工作时遇到的。
当时在一个营销媒体平台,系统中有类似微博等平台的海量图片,没抓过来,直接引用图片原地址的。
问题和你说的一样,图片会不断失效,当时我想到的一个办法是使用 JS 的 onerror 属性,比如原图是 https://weibo.com/images/123.png ,那么 onerror 的时候就是 myhost.com/xxxxx?url=https://weibo.com/images/123.png
两种方案,
这个 xxxxx 可以是静态的图片,用 filebeat 监控 Nginx log ,自己写脚本分析,
这个 xxxxx 也可以是你的 PHP 接口,接口干两件事,拿 404 的图片地址,然后输出一个默认图片。
这个的好处是把 404 图片的发现放到了用户浏览器上,只要用户浏览器请求一发现,第一时间你的服务器就可以拿到浏览器的上报,完全不用自己去抓。
实际上这玩意你自己没法抓的,假定十万图片,那么你每天轮询多少遍呢?一小时 5 遍也 100 遍了,那就得 1 亿图片请求。
假如一百万图片呢?每天请求十亿次?
而且同样的,也未必能在第一时间发现原图 404 了。
方案仅供参考
bjzhush
2022-12-10 23:34:26 +08:00
修正下,不是 JS 的 onerror ,是 img 的 onerror
janus77
2022-12-12 00:02:33 +08:00
关于这事我可以分享一个小发现,其实微博的图床地址不是固定的,比如某个地址你开始引用的时候使用的 url 是 wx1.sinaimg.cn/xxx ,过一段时间后可能这个地址访问就挂了,然后实际上图片还是存在的,你可以访问 wx2.sinaimg.cn/xxx 或者 wx3.sinaimg.cn/xxx ,就会发现这个图片能正常打开了。我不知道背后机制是什么样的,也不知道这个 wx 开头的池子里到底有几个备用地址,但是感觉 5 个应该够了吧,你批量下载的时候可以试着换一换地址,可能会提升一点成功率
Leon406
2022-12-24 10:49:32 +08:00
一楼正解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/901578

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX