如何在ruby中获取页面的所有资源

时间:2013-03-04 15:47:13

标签: ruby http

ruby​​,httparty,rest-client等中有许多http请求工具。但是大多数都只获取页面本身。是否有一个工具可以像浏览器那样获取页面的html,javascript,css和图像?

1 个答案:

答案 0 :(得分:0)

我想到了{p> Anemone,但它不是为了做单页而设计的。如果你有时间设置它,它是有能力的。

使用像Nokogiri这样的HTML解析器来检索页面内容并不难。您可以迭代感兴趣的标记,获取其“SRC”或“HREF”参数并请求这些文件,将其内容存储在磁盘上。

使用Nokogiri和OpenURI的简单,未经测试和即时书面示例将是:

require 'nokogiri'
require 'open-uri'

html = open('http://www.example.com').read
File.write('www.example.com.html', html)
page = Nokogiri::HTML(html)
page.search('img').each do |img|
  File.open(img['src'], 'wb') { |fo| fo.write open(img['src']).read }
end

获取CSS和JavaScript有点困难,因为您必须确定它们是嵌入在页面中还是资源,需要从其源中检索。

仅仅下载HTML和内容很简单。创建独立页面版本并从本地缓存中读取内容要困难得多。您必须重写所有“SRC”和“HREF”参数以指向磁盘上的文件。

如果您希望能够在本地缓存网站,那就更糟糕了,因为您必须重新跳转页面中的所有锚点和链接以指向本地缓存。此外,你必须编写一个完整的站点蜘蛛,它足够聪明,可以留在一个站点内,不遵循冗余链接,服从站点的ROBOTS文件,不消耗你所有的或带宽,并让你被禁止或起诉。 / p>

随着任务的增长,您还必须考虑如何组织所有文件。将一个页面的资源存储在一个文件夹中是草率的,但这是一种简单的方法。在一个文件夹中存储两个页面的资源会成为一个问题,因为您可以针对不同的图像或脚本或CSS进行文件名冲突。此时,您必须使用多个文件夹,或切换到使用数据库来跟踪资源的位置,并使用唯一标识符重命名它们,并将这些文件重写为已保存的HTML,或编写可以解决这些请求的应用程序,返回正确的内容。