下载整个HTML页面?

4
我正在尝试编写一个屏幕抓取程序,想要下载一个网站的主页。
当我在浏览器中查看页面源代码时,没有获取到完整的HTML代码。如何确保我加载了在浏览器中查看源代码时看到的所有内容?
# Required Gems
require 'rubygems' # Loads gems
require "nokogiri" # Nokogiri
require "open-uri" # For Nokogiri
require "chronic" # For time parsing
require "cgi" # For parsing urls
require 'net/http' # For image downloading


URL = URI.parse("http://www.gocrimson.com/landing/index")

hBOList = Nokogiri::HTML(open(URL)) 

这不是 Nokogiri 的问题。在 Nokogiri 看到内容之前,页面的下载就已经发生了。 - the Tin Man
4个回答

3
浏览器对源代码的视图不一定与请求的HTML文件本身匹配,因为在原始请求页面加载后使用Ajax加载页面块。
如果页面使用JavaScript和Ajax,则无法使用常规方法检索页面源代码,除非您解码整个内容链并在Ruby代码中重新创建它们。
或者,您可以使用Ruby可以通信的浏览器,告诉它加载初始页面,这将触发浏览器中JavaScript的操作,浏览器将加载其他内容,然后您的代码可以提取它并执行您想要的操作。为此,您应该查看Watir或其衍生产品。

0

Hisako和redcup,你们应该像Tin Man上面建议的那样尝试使用watir。就像这样:

require 'rubygems'
require 'watir-webdriver'

browser = Watir::Browser.new
browser.goto "http://www.gocrimson.com/landing/index"

puts browser.html

应该可以满足你的需求。


0

这样做:

require 'open-uri'
File.open("page_test.txt","w"){|f| f << open("http://www.gocrimson.com/landing/index").read}

需要复制整个页面的内容吗?如果是这样,Nokogiri可能会在某个地方丢失一些内容和/或在页面渲染后通过JavaScript加载某些内容。如果不是,请提供您的解析代码。


不,它不会。这个页面似乎有很多内容都是用JavaScript加载的。有没有办法绕过这个问题? - redcup
这个问题的答案对我也很有趣 ;) (也许是一些模拟浏览器的宝石?) - Maximilian Stroh
1
Nokogiri不会“在某个地方丢掉东西”。如果文档格式不正确,它可能不喜欢它并进行一些修复,但可以使用“errors”方法进行检查。 - the Tin Man
File.open("page_test.txt","w") {|f| f << open("http://www.gocrimson.com/landing/index").read} 更好的写法是 File.write("page_test.txt", open("http://www.gocrimson.com/landing/index").read) - the Tin Man

0

我认为某些内容是在某个按钮点击或某些操作后通过ajax调用加载的。如果你知道你想要的东西和哪个动作会做到这一点,那么你可以看看机械化。机械化内部使用Nokogiri,它有助于加载需要某些操作的页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接