【问题标题】:Opening a WIKI URL with a comma using `open-uri`使用 `open-uri` 打开带有逗号的 WIKI URL
【发布时间】:2010-03-01 21:28:30
【问题描述】:

我遇到OpenURI::HTTPError: 403 Forbidden 错误 当我尝试 open 带有逗号的 URL(或其他特殊字符,如 .)时。 我可以在浏览器中打开相同的网址。

require 'open-uri'
url = "http://en.wikipedia.org/wiki/Thor_Industries,_Inc."
f = open(url)
# throws OpenURI::HTTPError: 403 Forbidden error

如何转义这样的 URL?

我尝试使用CGI::escape 转义网址,但我得到了同样的错误。

f = open(CGI::escape(url))

【问题讨论】:

    标签: ruby-on-rails ruby open-uri


    【解决方案1】:

    通常,只需要模块cgi,然后使用CGI::escape(str)

    require 'cgi'
    require 'open-uri'
    escaped_page = CGI::escape("Thor_Industries,_Inc.")
    url = "http://en.wikipedia.org/wiki/#{escaped_page}"
    f = open(url)
    

    但是,这似乎不适用于您的特定实例,并且仍然返回 403。无论如何,我将把它留在这里以供参考。


    编辑: Wikipedia 拒绝您的请求,因为它怀疑您是机器人。似乎某些明确内容的页面已授予您,但那些与其“安全”模式不匹配的页面(例如包含点或逗号的页面)将受到其筛选。如果您实际输出内容(我使用Net::HTTP 执行此操作),您会得到以下结果:

    脚本应使用包含联系信息的用户代理字符串,否则它们可能会在不通知的情况下被 IP 阻止。

    但是,提供用户代理字符串可以解决问题:

    open("http://en.wikipedia.org/wiki/Thor_Industries,_Inc.",
      "User-Agent" => "Ruby/#{RUBY_VERSION}")
    

    【讨论】:

    • 我曾尝试CGI::escape 得到类似的结果。我忘了在我的问题中添加它。
    • 你可能想看看你得到了什么输出。我记得几周前 Wikipedia 在从 Ruby 发出请求时开始给我 403 错误,因为我没有提供任何用户代理字符串,并且输出是这样的。
    • @KandadaBoggu:是的,就是这样。进行了编辑。
    • 太棒了!有用。不相关的问题:您是否会限制对 wiki 的请求以避免速率限制?
    • 这只是我花了几个小时做的一个副项目;我从来没有真正达到我达到速率限制的地步。但是,如果他们确实有这种系统,那么您可能需要进行某种类似的调用。
    猜你喜欢
    • 2021-05-07
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多