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/
获取实际合同列表,然后分别请求每个合同。
我正在学习 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/
获取实际合同列表,然后分别请求每个合同。