【发布时间】:2012-06-11 03:22:02
【问题描述】:
我正在阅读http://ruby.bastardsbook.com/ 提供的 Ruby 教程,我遇到了以下代码:
require "open-uri"
remote_base_url = "http://en.wikipedia.org/wiki"
r1 = "Steve_Wozniak"
r2 = "Steve_Jobs"
f1 = "my_copy_of-" + r1 + ".html"
f2 = "my_copy_of-" + r2 + ".html"
# read the first url
remote_full_url = remote_base_url + "/" + r1
rpage = open(remote_full_url).read
# write the first file to disk
file = open(f1, "w")
file.write(rpage)
file.close
# read the first url
remote_full_url = remote_base_url + "/" + r2
rpage = open(remote_full_url).read
# write the second file to disk
file = open(f2, "w")
file.write(rpage)
file.close
# open a new file:
compiled_file = open("apple-guys.html", "w")
# reopen the first and second files again
k1 = open(f1, "r")
k2 = open(f2, "r")
compiled_file.write(k1.read)
compiled_file.write(k2.read)
k1.close
k2.close
compiled_file.close
代码失败并出现以下跟踪:
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http': 403 Forbidden (OpenURI::HTTPError)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open'
from /Users/arkidmitra/tweetfetch/samecode.rb:11
我的问题不在于代码失败,而是每当我将 r2 更改为 Steve_Jobs 以外的任何内容时,它都能正常工作。这里发生了什么?
【问题讨论】:
-
有代理或可能过滤 url 的东西吗?您是否尝试过通过同一台机器上的其他东西点击“坏”网址,例如lynx 浏览器?
-
没什么。甚至可以使用 wget "en.wikipedia.org/wiki/Steve_Jobs"。我很惊讶。
-
您可以尝试设置像
open(remote_full_url, "User-Agent" => "Mozilla/5.0 (Windows NT 6.0; rv:12.0) Gecko/20100101 Firefox/12.0 FirePHP/0.7.1")这样的用户代理吗? -
是的,现在可以使用了。你能解释一下是什么问题吗?我应该结束这个问题还是你会提供答案而不是评论?
-
在API-wiki 中它说没有用户代理的请求被阻止并返回403。但我无法真正解释为什么这只适用于“Steve_Jobs”文章(甚至无法使用 API 访问)。他们也有一个user-agent policy,但没有任何迹象表明使用了 403 错误代码。所以我真的没有答案来解释这种行为。
标签: ruby open-uri http-error