Ruby 将URL映射到文件名的可扩展方法

Ruby 将URL映射到文件名的可扩展方法,ruby,Ruby,问题:有数百万个URL(格式:),我需要将这些URL名称转换成以后可以用作文件名的名称(许多操作系统不允许在文件名中使用冒号或破折号) 到目前为止,我一直在尝试这样做,希望不会因为base64简单的编码/解码而使用键值数据库: require 'base64' p Base64.encode64('insert some REALLY long URL here') # would produce some random name to use as a filename # I'd do

问题:有数百万个URL(格式:),我需要将这些URL名称转换成以后可以用作文件名的名称(许多操作系统不允许在文件名中使用冒号或破折号)

到目前为止,我一直在尝试这样做,希望不会因为base64简单的编码/解码而使用键值数据库:

require 'base64'

p Base64.encode64('insert some REALLY long URL here') # would produce some random name to use as a filename

# I'd do Base64.decode64 to later to get back to the URL
问题是URL越长,base64字符串就越长。这是不好的,因为操作系统对文件名的长度有限制

我也尝试过secure_random,但问题是,a)随机性不能保证b)我必须使用一些数据库才能将随机字符串映射到URL


如果有一种方案允许您输入字符串并将其转换为固定长度的字母数字字符(可以用作文件名),然后轻松地将其反编码为原始字符串,这将是理想的。如果这样的东西不存在,那么解决这个问题的下一个最佳方法是什么呢?

URL已经是一个文件路径和文件名,只是它还有一个协议。因此,请使用专门用于处理URL的工具,并将其拆分为所需的部分:

require 'uri'

uri = URI.parse('http://example.com/some_page')
uri.path # => "/some_page"
/some_page
很难准确说出正在查看的内容。它可以是两个目录,或者一个目录和一个文件,因此需要对站点有一些预先的了解才能确定,但是,无论哪种方式,都有一些工具使其更易于使用:

uri_path = uri.path
File.dirname(uri_path) # => "/"
File.basename(uri_path) # => "some_page"
File.split(uri_path) # => ["/", "some_page"]
给出的示例没有太多地说明
dirname
basename
split
的工作原理,但是您可以在
文件
文档中阅读更多有关它们的信息。而且,您想用这些组件做什么取决于您自己

也可以提取主机信息:

uri.host # => "example.com"
因为
在文件名或路径中有效,所以可以保持名称不变。但是,重要的是要了解主机名不一定是ASCII格式的。互联网在不断变化,标准允许使用操作系统可能不喜欢的二进制字符,或者您的大脑和眼睛,或者您的客户可能不喜欢的二进制字符。因此,这就提出了一个问题,即如何在磁盘上正确构建指向文件的路径

虽然使用Base64对名称进行编码可能会起作用,但您仍然可能需要花费很长时间才能返回文件列表及其来源。搜索将是痛苦的,可怕的

相反,我强烈建议构建一个用于将URL映射到文件路径的数据库。数据库甚至可以用来包含文件,或者您可以简单地将文件重命名为相关记录的行ID。数据库还可以包含有关文件的元数据,例如文件类型、大小、首次检索文件时的日期/时间戳、更新日期/时间戳、上次检查日期/时间戳等。数据库成为文件知识的中心点,而磁盘上的文件仅是该信息的一部分

您必须决定如何实现这一点,因为有很多种方法可以将资源映射到文件,但试图在磁盘上创建一个庞大的站点/路径/到/资源文件层次结构,而基于拆分URL,这样做既不能很好地扩展,也不能很好地利用磁盘


什么类型的数据库最适合存储HTML内容?有了数百万的HTML页面,数据库将是巨大的

像样的?我不能说,因为我不知道你在做什么,但是如果你保存页面,MySQL或PostgreSQL可以很容易地处理这个问题。如果不需要,那么如果您只需要元数据,则键/值存储将起作用。现在,一百万行已经不多了。更好的问题是,您需要多少磁盘空间、RAM、多少CPU以及多少网络带宽

如果您正在进行分析或抓取和更新页面,那么每天处理数百万个页面将需要两台主机不断运行数据库和检索页面,并且需要移动大量文本。(当我负责编写《财富》500强公司的网站分析和抓取代码时,我被认为是我们公司网络利用率最高的人,并且已经编写了数百个蜘蛛程序,因此我对遇到的问题有了一些了解。)

为什么要存储数百万页

  • 您是否还要存储与页面相关的所有其他相关资源/对象?您是否希望能够将这些页面返回给其他人?你打算重写所有嵌入到这些资源的链接吗
  • 是否只检查页面的更改?如果是这样,有比存储整个页面更好的跟踪方法
  • 你想充当这些页面的搜索引擎吗?然后存储要提供的元数据,并在处理后丢弃HTML

许多HTTPd服务器支持ETag和其他各种头文件,这些头文件可以告诉您是否知道页面自上次看到后是否发生了更改。一个HEAD请求也会有所帮助。在最坏的情况下,通过比较存储的MD5值并计算新的MD5值,使用MD5查看缓存页面和最近检索到的远程页面是否匹配就足够了。

有数百万个URL,其中一些URL的路径相同。我需要转换整个URL,从http开始,到uri路径结束,这样我以后可以准确地引用它。创建合适的答案需要时间。因此我猜测,使用securerandom(复制的概率很低)和重复检查以及简单的键值数据库(如GDBM)来映射值将完成这项工作。什么类型的数据库最适合存储HTML内容?如果有数百万个HTML页面,那么数据库将是巨大的……请参阅其他信息。我需要存储它们的HTML,然后快速对它们执行各种查询,因此必须在本地存储它们的HTML。因此,它最接近于那些页面的搜索引擎,但我不确定如何抛出HTML