使用 Mechanize 和 Ruby 检索特定 Div 下的图像

Retrieving images under a specific Div with Mechanize and Ruby

我需要使用 Ruby 和 Mechanize 检索特定 div 下存在的所有图像。相关DOM结构如下:

<div id="item_img">
<a href="JavaScript:imageview('000000018693.jpg')">
<img src="/shop/doubleimages/0000000186932.jpg" border="0" width="500" height="500" alt="関係ないコメント z1808">
</a>
<img src="/shop/doubleimages/000000018693_1.jpg"><br><br>
<img src="/shop/doubleimages/000000018693_2.jpg"><br><br>
<img src="/shop/doubleimages/000000018693_3.jpg"><br><br>
</div>

所以,我最初通过以下方式启动新代理后获得了所有图像:

agent = Mechanize.new
agent.user_agent_alias = 'Mac Safari'
page = agent.get ('http://double14.com/shopdetail/000000018693/')
puts page.images

这很好,但页面上的每张图片(它应该如此)似乎都删除了它上面的 div id,因此无法确定什么来自哪里。结果,页面上的所有图片都出现了(没有布埃诺)。

我把它归结为:

agent = Mechanize.new
agent.user_agent_alias = 'Mac Safari'
page = agent.get ('http://double14.com/shopdetail/000000018693/')
node = page.search "#item_img img"
  node.each do |n|
  puts n.attributes['src']
end

不幸的是,输出如下 -

/shop/doubleimages/0000000186932.jpg
/shop/doubleimages/000000018693_1.jpg
/shop/doubleimages/000000018693_2.jpg
/shop/doubleimages/000000018693_3.jpg

有没有办法获取完整的 URL 并改用它?最终,我想将这些图像保存到数据库中,但我需要完整的 URL 将它们序列化到磁盘以供以后上传。

这就是我为一组图像所做的。在这种情况下,base_uri 是您要传递的 url。如果您有任何问题,请告诉我。

def self.qualify_images(base_uri, images)
    images.map do |image|
      next unless has_src?(image)
      qualify_image(base_uri, image)
    end.compact
  end

  def self.qualify_image(base_uri, image)
    src = image.attributes["src"].value
    if src =~ /^\/[\/]/
      result = "#{scheme(base_uri)}#{src}"
    elsif src =~ /^\//
      result = "#{base_uri}#{src}"
    else
      result = src
    end
    http?(result) ? result : nil
  end

  def self.has_src?(image)
    image.attributes["src"].value
  rescue NoMethodError
    false
  end

  def self.scheme(uri)
    uri = URI.parse(uri)
    "#{uri.scheme}:"
  end

  def self.http?(uri)
    uri = URI.parse(uri)
    uri.kind_of?(URI::HTTP)
  rescue URI::InvalidURIError
    false
  end

这将确保每张图片都有一个完全合格的 uri。

它将看起来像:

page.search("#item_img img").each do |img|
  puts page.uri.merge(img[:src]).to_s
end

是的。您可以使用 #resolve 方法获取图像的完整 URL:

require 'mechanize'

mechanize = Mechanize.new
mechanize.user_agent_alias = 'Mac Safari'

page = mechanize.get('http://double14.com/shopdetail/000000018693/')

page.search('#item_img img').each do |img|
  puts mechanize.resolve(img['src'])
end

或者您可以使用#download 方法直接下载它们。