Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ruby中获取页面的所有资源_Ruby_Http - Fatal编程技术网

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

如何在ruby中获取页面的所有资源,ruby,http,Ruby,Http,ruby、HttpParty、rest客户机等中有许多http请求工具,但大多数工具只获取页面本身。有没有一个工具可以像浏览器一样获取页面的html、javascript、css和图像?想到了,但它不是设计用来完成单个页面的。如果你有时间设置它,它是有能力的 使用Nokogiri之类的HTML解析器检索页面内容并不困难。您可以迭代感兴趣的标记,获取它们的“SRC”或“HREF”参数并请求这些文件,将它们的内容存储在磁盘上 一个使用Nokogiri和OpenURI的简单、未经测试和动态编写的示例是

ruby、HttpParty、rest客户机等中有许多http请求工具,但大多数工具只获取页面本身。有没有一个工具可以像浏览器一样获取页面的html、javascript、css和图像?

想到了,但它不是设计用来完成单个页面的。如果你有时间设置它,它是有能力的

使用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文件,不消耗你或他们的所有带宽,并让你被禁止或起诉


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

此页面是否是应用程序的本地页面,还是在野外?目的是什么?换句话说,你具体想做什么,为什么是Ruby?像wget这样的东西可能适合您的需求,这取决于您的实际需求。否则,这是一个递归问题,或者使用浏览器驱动程序或无头浏览器。这还取决于您是否需要运行JavaScript,例如,动态加载的内容。很明显,其目的是从站点下载整个页面。由于大多数页面都塞满了受版权保护的材料,因此其意图更难理解,但如何处理这些内容则是OP的因果报应。你的问题还不够明确。一旦文件在磁盘上,您需要做什么?关于编写这种代码,您知道多少?什么都不知道,或者您能够将这些代码拼凑起来?回答这个问题你可以拿一整本书,因为Ruby中很少有应用程序(如果有的话)可以做你想做的事情。@theTinMan的目的(“做某事的原因[…])并不明显,因为它没有说明,所以我的问题是。原因将是什么将推动我的答案。例如,如果目的是要有一个可以与之交互的页面,我会推荐类似于Capybara等的东西。如果要获取一个完整的页面以在本地进行交互,我会问“为什么是Ruby”(就像我所做的那样)。等