Ruby 获取 URL 内容始终为空

0 投票
2 回答
664 浏览
提问于 2025-04-16 10:58

我真的很沮丧,因为我想用Ruby来获取一个特定网址的内容。

我尝试了很多不同的方法,比如用open-uri和标准请求,但都没有成功。我总是得到空的HTML。我还尝试用Python去获取同样的网址,结果总是能正确返回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

2 个回答

2

这里有两个使用 openURI 的例子(这是一个标准库),它是一个封装工具,可以简化一些比较复杂的操作,比如 Net::HTTP。

require 'open-uri'

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

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

如果你的代码就是这样,那它有几个地方是错误的。

  1. 网址的开头应该是 http:// 而不是 http:
  2. 网址需要有路径。如果你想访问 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"

结果也是一样的不稳定。

撰写回答