网站里面大量引用了微博的图片,但是有些图片不断失效,导致图片无法显示;
用 curl ( PHP )抓取远程内容或者响应代码,抓不到;
想全部下载到本地,然后比对数据库和没有下载成功的图片,然后删掉,于是用了:
用浏览器图片下载插件,下载个一两万个之后全部错误;
甚至用迅雷批量下载也是,下载个几千个之后卡死。
还有啥办法?
1
needpp 2022-12-10 19:03:12 +08:00
curl -I xxx 只返回 head 信息
|
2
chenwenzhang 2022-12-10 19:39:04 +08:00
是不是请求头部少个 Referer 的原因
|
3
iOCZ 2022-12-10 20:02:43 +08:00
一楼正解
|
4
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 |
5
learningman 2022-12-10 20:38:15 +08:00
自己手写个下载器,限频换 IP 呗
|
6
CEBBCAT 2022-12-10 23:29:53 +08:00
曹国伟:淦
--- 你可以基于楼上提到的 HTPP HEAD 原理,构建一个分布或单体爬虫,对被删掉的照片做标记。你也可以在网页里面加入代码,图片加载失败后 POST 上报给你,你再决定要不要去爬。 直接下载的方式浪费带宽,耗时更久,学习一点 HTTP 知识想必可以帮你很多。 |
7
bjzhush 2022-12-10 23:33:33 +08:00 1
我告诉你个可行的办法,是我多年前工作时遇到的。
当时在一个营销媒体平台,系统中有类似微博等平台的海量图片,没抓过来,直接引用图片原地址的。 问题和你说的一样,图片会不断失效,当时我想到的一个办法是使用 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 了。 方案仅供参考 |
8
bjzhush 2022-12-10 23:34:26 +08:00
修正下,不是 JS 的 onerror ,是 img 的 onerror
|
9
janus77 2022-12-12 00:02:33 +08:00 1
关于这事我可以分享一个小发现,其实微博的图床地址不是固定的,比如某个地址你开始引用的时候使用的 url 是 wx1.sinaimg.cn/xxx ,过一段时间后可能这个地址访问就挂了,然后实际上图片还是存在的,你可以访问 wx2.sinaimg.cn/xxx 或者 wx3.sinaimg.cn/xxx ,就会发现这个图片能正常打开了。我不知道背后机制是什么样的,也不知道这个 wx 开头的池子里到底有几个备用地址,但是感觉 5 个应该够了吧,你批量下载的时候可以试着换一换地址,可能会提升一点成功率
|
10
Leon406 2022-12-24 10:49:32 +08:00
一楼正解
|