当页面元素不断变化和移动时,如何抓取 Ruby。

How to scrape in Ruby when the page elements keep changing and shifting.

我正在编写一个从 imgur 相册下载图像的程序:我刚刚开始编写实际图像-link-代码:

#The imports.
require 'open-uri'
require 'nokogiri'

url = ARGV[0]

#The title.
open(url) do |f|
  $doc = Nokogiri::HTML(f)
  title = $doc.at_css('title').text.strip.clone
  re = /\/[a]\/\w{5}/
  s2 = url.match re
  puts title
  puts s2
end



href = $doc.xpath("//img")
puts href

当我运行遇到一个大问题:我下载的页面不是页面源。

例如:这张相册:http://imgur.com/a/tGRvr/layout/grid 的图像代码如下:

<span class="post-grid-image pointer" data-href="//i.imgur.com/zh6I7k2.png" data-title="" style="transform: translate(0px, 0px) scale(1); z-index: 0; background-image: url(&quot;//i.imgur.com/zh6I7k2b.jpg&quot;);"></span>

然而,当我查看页面源代码或 运行 span 元素的代码时,所有图像都丢失了:

            <div class="post-images is-owner">









            <div class="post-action nodisplay"></div>

            </div>
        </div>

HTML 处于活动状态,并根据我的浏览器的情况而变化。页面源代码中没有任何图像,所有内容都是使用某种奇怪的 java 系统加载的。当甚至没有任何活动元素可供抓取时,我如何抓取活动元素?

inspect 和 'view-source' 有什么区别?这就是整个问题的开始。

它是动态的 HTML。机械化 and/or Nokogiri 无法帮助您,除非您可以构建页面的最终版本然后将其传递给他们。

相反,您必须使用可以解释 JavaScript 并应用 CSS 的东西,例如浏览器。 WATIR 项目将是首先要调查的事情。 "inspect" 和 "view-source" 都反映了浏览器处理完其中的 JavaScript 和 CSS 之后的页面,这通常与在那之前的实际页面看起来没什么关系.在 SO 中搜索 [ruby] [watir].

使用 wgetcurlnokogiri 检索页面,以便您可以看到原始 HTML。

$doc.at_css('title') 应该使用 title 方法:doc.title

不要使用像 $doc 这样的全局变量。了解变量作用域,然后决定全局变量是否是正确的方法。

而不是 open 块:

open(url) do |f|
  $doc = Nokogiri::HTML(f)
  title = $doc.at_css('title').text.strip.clone
  re = /\/[a]\/\w{5}/
  s2 = url.match re
  puts title
  puts s2
end

改为这样做:

doc = Nokogiri::HTML(open(url))
title = doc.title

使用 URIs/URLs 时,请使用内置 URI class,因为它是一个调试良好的工具:

require 'uri'

url = URI.parse('http://imgur.com/a/tGRvr/layout/grid')

url.path # => "/a/tGRvr/layout/grid"
  .split('/') # => ["", "a", "tGRvr", "layout", "grid"]

了解这一点,你可以做到:

url.path.split('/')[2] # => "tGRvr"