当页面元素不断变化和移动时,如何抓取 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("//i.imgur.com/zh6I7k2b.jpg");"></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]
.
使用 wget
、curl
或 nokogiri
检索页面,以便您可以看到原始 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"
我正在编写一个从 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("//i.imgur.com/zh6I7k2b.jpg");"></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]
.
使用 wget
、curl
或 nokogiri
检索页面,以便您可以看到原始 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"