Ruby: Net::HTTP 并重定向

Ruby: Net::HTTP and redirects

我正在学习 http://ruby.bastardsbook.com/chapters/web-crawling/ 上的教程,想对“处理重定向”一节做一些澄清,因为自撰写本文以来,作者用作示例的 DOD 网站已经重新制作,我在调整他的代码以使用当前版本时 运行 出现了一些意想不到的结果。 (请注意,我不需要帮助重写代码,我只是想知道为什么会发生这里发生的事情)

具体来说,无论我尝试使用 Net::HTTP.get_response 获取的页面是否存在,我都会收到代码 301。例如:

require 'net/http'

VALID = 'https://www.defense.gov/News/Contracts/Contract-View/Article/14038760'
INVALID = 'https://www.defense.gov/News/Contracts/Contract-View/Article/14038759'

resp = Net::HTTP.get_response(URI.parse(VALID))
puts resp.code # 301

resp = Net::HTTP.get_response(URI.parse(INVALID))
puts resp.code # 301

那么,为什么有效地址 return 301 永久移动?不仅如此,而且实际上尝试遵循该重定向(在该教程的范围内无用,因为重点是跳过任何不是 2xx 的内容),如此处 所建议的那样,可能会给我一个 404因为重定向 link 有一个尾部斜杠。

if resp.code == '301'
  resp = Net::HTTP.get_response(URI.parse(resp.header['location']))
end
puts resp.code # 404

更令我困惑的是,当我查看 resp.body 时,我发现尽管出现了 404 错误,但实际上我已经成功下载了该页面的内容。

如果有人带我了解这里到底发生了什么,我将不胜感激。感谢您的帮助和提前抽出时间。

这似乎不是 Ruby 问题,而是 www.defense.gov 方式。 https://www.defense.gov/News/Contracts/Contract-View/Article/14038760 给出重定向 (301) 然后 404 尽管有办法得到它。

https://www.defense.gov/News/Contracts/Contract-View/Article/14038760 似乎是一些缺失数据的 url 但 https://www.defense.gov/News/Contracts/Contract-View/Article/1403876/ 工作正常(实际为 26.17.2017 03:24 +7)。为什么您认为 ID 为 14038760 的 url 有效?

我发现 https://www.defense.gov/News/Contracts/Contract-View/Article/1403876 重定向到 https://www.defense.gov/News/Contracts/Contract-View/Article/1403876/(相同的 url 但带有尾部斜杠),而带有尾部斜杠的 url 立即给出 200 响应.

你能做什么?尝试先在此处 https://www.defense.gov/News/Contracts/source/nav/ 获取实际合同列表,然后分别请求每个合同。