V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tellmeworld
V2EX  ›  程序员

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

  •  
  •   tellmeworld · 2022-12-10 18:55:32 +08:00 · 2635 次点击
    这是一个创建于 705 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    还有啥办法?

    10 条回复    2022-12-24 10:49:32 +08:00
    needpp
        1
    needpp  
       2022-12-10 19:03:12 +08:00
    curl -I xxx 只返回 head 信息
    chenwenzhang
        2
    chenwenzhang  
       2022-12-10 19:39:04 +08:00
    是不是请求头部少个 Referer 的原因
    iOCZ
        3
    iOCZ  
       2022-12-10 20:02:43 +08:00
    一楼正解
    we21x
        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
    learningman
        5
    learningman  
       2022-12-10 20:38:15 +08:00
    自己手写个下载器,限频换 IP 呗
    CEBBCAT
        6
    CEBBCAT  
       2022-12-10 23:29:53 +08:00
    曹国伟:淦
    ---
    你可以基于楼上提到的 HTPP HEAD 原理,构建一个分布或单体爬虫,对被删掉的照片做标记。你也可以在网页里面加入代码,图片加载失败后 POST 上报给你,你再决定要不要去爬。

    直接下载的方式浪费带宽,耗时更久,学习一点 HTTP 知识想必可以帮你很多。
    bjzhush
        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 了。
    方案仅供参考
    bjzhush
        8
    bjzhush  
       2022-12-10 23:34:26 +08:00
    修正下,不是 JS 的 onerror ,是 img 的 onerror
    janus77
        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 个应该够了吧,你批量下载的时候可以试着换一换地址,可能会提升一点成功率
    Leon406
        10
    Leon406  
       2022-12-24 10:49:32 +08:00
    一楼正解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1040 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:18 · PVG 06:18 · LAX 14:18 · JFK 17:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.