You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mechanize gem爬取维基百科图片出现404错误如何解决

问题排查与修复方案

核心问题原因

  • 调用agent.head()时直接传入Mechanize::Image对象,未主动获取解析完成的绝对URL,导致URL被二次编码:报错链接中的%2528就是二次编码的典型特征(原字符(首次编码为%28,其中%被再次编码为%25后就变成%2528),服务器无法识别该地址返回404。
  • 维基服务器对请求头校验较严格,默认Mechanize的UA可能会被拦截,导致部分请求失败。

修复后代码

def images
  agent = Mechanize.new
  # 设置真实浏览器UA,降低反爬拦截概率
  agent.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
  page = agent.get("https://en.wikipedia.org/")
  page.images.each do |image|
    # 获取解析完成的绝对URL,避免二次编码问题
    img_url = image.resolved_uri.to_s
    puts "当前图片地址:#{img_url}"
    begin
      response = agent.head(img_url)
      size = response["content-length"].to_i / 1000
      puts "图片大小:#{size}KB"
    rescue Mechanize::ResponseCodeError => e
      puts "图片请求失败,状态码:#{e.response_code}"
    end
  end
end

额外优化建议

  • 增加异常捕获逻辑,避免单个图片请求失败中断整个爬取流程
  • 增加请求间隔,避免短时间大量请求触发维基的频率限制
  • 如果HEAD请求持续被拦截,可以将agent.head(img_url)替换为agent.get(img_url, head: true),Mechanize会自动适配请求逻辑

内容的提问来源于stack exchange,提问作者SkRoR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:24:04