【问题标题】:ruby fetching url content is always emptyruby 获取 url 内容总是空的
【发布时间】:2011-06-18 21:07:12
【问题描述】:

我很沮丧尝试使用 Ruby 来获取特定的 url 内容。

我尝试了许多不同的方法,例如 open-uri,标准请求到目前为止都没有奏效。 我总是得到空的 html。 我还尝试使用 python 来获取相同的 url,它总是返回正确的 html 内容。我真的不知道为什么...请帮助,因为我是 Ruby 和 Python 的新手... 我想使用 Ruby(更喜欢整洁的语法和人性化的函数名称,更容易使用 gem 和 homebrew 安装库(在 mac 上)而不是 python easy_install) 但我现在正在考虑使用 Python,因为它可以正常工作(但仍然试图解决 2.x 和 3.x 的问题)。我可能正在做一些非常愚蠢的事情,但我认为这不太可能。

ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-darwin10.6.0]

实施 1:

url = URI.parse('http//:www.stackoverflow.com/') req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
puts res.body #empty

实施 2:

doc = Nokogiri::HTML(open("http//:www.stackoverflow.com/", "User-Agent" => "Safari"))
#empty
#I tried to use without user agent, without Nokogiri none worked.

每次都能完美运行的 Python 实现

f = urllib.urlopen("http//:www.stackoverflow.com/")
# Read from the object, storing the page's contents in 's'.
s = f.read()
f.close()

print s

【问题讨论】:

  • 也许你需要跟随重定向?
  • "http:www.url.com" 可能是一个例子,好吧,但是“//”部分发生了什么?无论如何,您应该发布您尝试下载的真实网址,否则没有什么可测试的,只能猜测。
  • 你说你的 Python 工作很有趣。我收到一条错误消息,提示存在 http 错误,“未指定主机”。
  • 例如 www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia
  • 非常感谢我用下面给出的代码测试的响应,到目前为止没有一个有效的答案。使用上述 python 代码,如果您将 URL 更新为黄页,它将显示实际的 html。

标签: python ruby http url


【解决方案1】:

如果那是您的确切代码,则由于多种原因它是无效的。

  1. http: 应该是 http://
  2. URL 需要一个路径。如果你想要 example.com 的根页面,它需要是 http://example.com/ 尾部斜杠很重要。
  3. 如果你把两行代码放在一行你需要使用;表示第一行的结束

所以

require 'net/http'

url = URI.parse('http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
puts res.body

在 nokogiri 中使用 open 也是如此

编辑:该网站多次返回不良结果:

counter = 0

20.times do
  url = URI.parse('http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia')
  req = Net::HTTP::Get.new(url.path)
  res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
  sleep 1
  counter +=1 unless res.body.empty?
end

puts counter

对我来说,这只返回一次非空的身体。如果你在另一个网站上替换它一直有效

curl "http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia"

产生同样不一致的结果。

【讨论】:

  • 我在上面的评论中给出了我正在测试的 url。我再次测试了您的代码,结果为空。
  • 我在那个网站上得到了间歇性的结果。我认为它大部分时间都在返回空的身体。多次运行该代码,您将看到。如果我用 yahoo.com 运行它,它每次都能正常工作。
  • 我很想知道为什么当我运行 python 代码时它每次都返回正确的 html。在大多数情况下,在 ruby​​ 代码的情况下,它返回空结果。我仍在努力解决这个问题。因为如果 Ruby lib 不是“可靠的”,那么我应该考虑在我的特殊情况下使用 python。
  • ruby 库可靠,站点不可靠。我不知道为什么它一直在 python 中运行。如果我在我的 shell 中运行 CURL(与 Ruby 无关),我也会有一半的时间得到空白结果。我不认为 curl 和 Net::HTTP 坏了我认为网站是。尝试在 python 中运行一个与我类似的示例(IE 就像一个 20 次点击的循环),我认为你不会得到 100% 的结果。
  • 有没有办法增加在 Ruby 中获得更一致结果的变化?比如更长的时间等等......我也认为该网站存在问题,因为我已经与其他一些网站进行了测试,然后它们中的大多数都按预期工作。
【解决方案2】:

openURI(标准库)的两个示例,一个(以及其他)相当繁琐的 Net::HTTP 的包装器:

require 'open-uri'

open("http://www.stackoverflow.com/"){|f| puts f.read}

puts URI::parse("http://www.google.com/").read

【讨论】:

  • 我在上面的评论中给出了我正在测试的 url。使用 open() 方法时出现错误,使用 URI::parse 时,我会得到正常的空结果。
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 2018-07-16
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2011-09-18
相关资源
最近更新 更多