使用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
相关产品推荐
相关产品推荐

