【问题标题】:Why does OpenURI return a 404, when the parsed URL works fine in browser?当解析的 URL 在浏览器中正常工作时,为什么 OpenURI 返回 404?
【发布时间】:2014-12-10 08:36:32
【问题描述】:

我正在尝试对包含丹麦字符 'ø' 等特殊字符的 URL 进行屏幕抓取。

网址是:

url = "http://www.zara.com/dk/da/dame/tilbehør/tilbehør/stribet-hue-c271008p2195502.html"

为了让 OpenURI 将其识别为有效 URL,我这样做了:

url = Addressable::URI.parse(url).normalize.to_s

并解析它:

doc = Nokogiri::HTML(open(url))

返回:

OpenURI::HTTPError: 404 Not Found

我不知道为什么 OpenURI 返回 404,因为规范化的 URL 在浏览器中可以正常工作。

为什么会出现这种情况以及我必须做些什么来解决它?

【问题讨论】:

  • 这对我来说很好 - 我得到了一个正常的 Nokogiri 文档。
  • @MaxWilliams - 这很奇怪。我每次都会收到 404。
  • 可能是 nokogiri 版本问题。我正在使用 v1.4.2
  • 我注意到的一件事是,该网站自动将该 url 重定向到 http://www.zara.com/?go=http%3A//www.zara.com/share/dame/tilbeh%25C3%25B8r/tilbeh%25C3%25B8r/stribet-hue-c271008p2195502.html,但它返回 200(而不是正常的重定向代码 302)(使用 Curl 测试)。我猜他们改变了他们的 url 架构以通过 go 参数而不是使用 REST 样式的嵌套路径来推送所有内容。我不知道这是否与您的问题有关。
  • 我想知道它是否对来自丹麦的请求有什么不同? (这会很奇怪,但并非闻所未闻)。你在哪里?

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


【解决方案1】:

我发现问题出在我试图解析的 URL 的服务器上。他们拒绝了 OpenURI 使用的默认用户代理。

从 OpenURI 上的 documentation 中可以看出,可以通过可选的哈希参数指定额外的标头字段:

open("http://www.ruby-lang.org/en/",
  "User-Agent" => "Ruby/#{RUBY_VERSION}",
  "From" => "foo@bar.invalid",
  "Referer" => "http://www.ruby-lang.org/") {|f|
  # ...
}

我刚刚使用了不同的用户代理,一切正常。

【讨论】:

  • 你最终使用了什么?我在 zara 也遇到了同样的问题 :)
  • 我用过:Mozilla/5.0 (X11; CrOS i686 12.433.216) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.105 Safari/534.30
猜你喜欢
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2021-10-02
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多