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

使用Nokogiri与open-uri时Rails爬取链接提示文件不存在错误

解决Rails控制器爬取URL时的No such file or directory错误

嘿,这个问题我碰到过好多次了!你看到的No such file or directory @ rb_sysopen - www.google.com错误,根源其实特别简单——你传入的URL缺少了HTTP/HTTPS协议头。

Ruby里的open方法(或者你用来读取内容的类似方法),如果拿到的字符串没有http://或https://前缀,会默认把它当成本地文件路径去查找,而不是远程网络地址。这就难怪它会提示找不到文件了!

具体解决方案

1. 补全URL的协议头

在控制器里先对传入的URL做校验和补全,确保它是完整的网络地址:

def crawl_page
  # 先拿到用户传入的URL并去除首尾空格
  raw_url = params[:url].to_s.strip

  # 补全协议头,优先用HTTPS
  full_url = if raw_url.start_with?('http://', 'https://')
               raw_url
             else
               "https://#{raw_url}"
             end

  # 用Ruby自带的Net::HTTP来请求页面(比直接用open更安全可靠)
  require 'net/http'
  uri = URI(full_url)
  
  # 发起请求并处理响应
  response = Net::HTTP.get_response(uri)
  if response.is_a?(Net::HTTPSuccess)
    @page_content = response.body
    # 这里可以加你后续的页面处理逻辑,比如渲染内容或存储
  else
    render plain: "爬取失败:#{response.message}", status: :bad_request
  end
# 捕获无效URL的异常
rescue URI::InvalidURIError => e
  render plain: "URL格式无效:#{e.message}", status: :bad_request
# 捕获还是找不到地址的异常(比如用户传了完全不存在的域名)
rescue Errno::ENOENT => e
  render plain: "无法访问该地址,请检查URL是否正确", status: :bad_request
end

2. 别再用open直接处理HTTP请求啦

旧版本Ruby的open方法处理HTTP请求不仅容易踩这种路径误解的坑,还有安全风险(比如可能被恶意利用读取本地文件)。建议用专门的HTTP客户端:

  • 用Ruby自带的Net::HTTP(上面代码里用的就是它,不需要额外装gem)
  • 或者更友好的第三方库比如Faraday、HTTParty,这些库能更方便地处理超时、重定向、请求头等细节。

3. 额外的小建议

  • 对用户传入的URL做严格校验,比如用正则表达式过滤掉非法字符
  • 给网络请求加超时时间,避免控制器因为等待响应而挂起
  • 如果频繁爬取同一页面,可以考虑加缓存,减少重复请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:48:31