【问题标题】:how can i get the size or weight from images url?如何从图像 url 中获取尺寸或重量?
【发布时间】:2012-02-25 20:27:19
【问题描述】:

参考上一个问题methods width and height Mechanize

我想知道如何使用 Mechanize 从网页图像中获取尺寸。

我已经创建了一个类似 helper 的方法,但是这个过程很慢,例如

url = "http://www.birchbox.com"
page = Mechanize.new.get(url)
images_url = page.images.map{|img| img.url.to_s }.compact

这是辅助方法:

def check_image_size
  images_urls.each do |image_url|
   image = MiniMagick::Image.open(image_url)
   if image[:width] < 100
    images_urls.delete("#{image_url}")
   end
  end
return images_urls
end

如果图像的宽度小于 100 像素,此方法会从数组中删除所有图像。

这种方法的问题是处理速度很慢。我的页面使用此方法加载时间过长。

是否有任何使用 Mechanize 快速简便的方法来做到这一点?

【问题讨论】:

  • 当您说
  • 我指的是图片的实际尺寸:D

标签: ruby-on-rails ruby screen-scraping mechanize


【解决方案1】:

看看Fast Image

FastImage 通过获取获取给定 uri 的图像的大小或类型 尽可能少

然后……

images.each do |src|
         size = FastImage.size(src)
         puts "width: #{size[0]}"
         puts "height: #{size[1]}"
     end
end

【讨论】:

    【解决方案2】:

    如果您想要图像的实际大小,则必须获取它。

    正如您所说,这可能需要很长时间。加快这一进程的一种方法是不获取整个图像,而是逐步获取它并在它出现时对其进行解析。一旦你有足够的图像来确定它的大小,你就可以停止阅读它。

    这相当复杂,可能不会一直有效,因为对于某些图像类型,您需要完全获取图像才能知道大小(我认为)。

    【讨论】:

    • 我的主要问题是 Mechanize 获取像素大小为 1x1 的图像或图像作为我不想显示的图标、头像等。我需要过滤这些图像。例如。像 spacer.gif 这样的图像,它的空白空间用于布局旧网页。然后我想知道如何过滤这种图像类型...
    • 您的要求没有简单的答案。你甚至不想要真实的图像大小,你想要显示的大小(因为大图像可以显示得很小,反之亦然。)这需要解释 CSS(可能还有 javascript)。您可以使用无头浏览器来做到这一点(有一些基于 webkit)。但就像我说的,这一切都不是微不足道的。
    【解决方案3】:

    我同意 smparkes,它很复杂,可能不会给您带来速度优势。但这里有一些加快速度的想法:

    • 检查文件大小。首先将图像下载到临时文件,然后您 将能够跳过小于 1Kb 左右的任何内容。
    • 分析文件名。你知道跳过 spacer.gif 但是名字怎么样 比如 my_tiny_image_20x20.gif
    • 同时下载。这很棘手,但您可以使用 eventmachine 同时下载图片。
    • 实现缓存。确定图像的宽度后,将其保存在 一个数据库,以便您下次可以查找它。

    【讨论】:

    • 谢谢,我想我已经解决了这个问题。在开发解决方案时,我会发布它:D
    猜你喜欢
    • 2011-08-02
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2011-04-22
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多