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

