Ruby:Net :: HTTP和重定向

问题描述 投票:1回答:1

我正在http://ruby.bastardsbook.com/chapters/web-crawling/的教程中工作,并希望对处理重定向的一点做一点澄清,因为作者给出的国防部网站自编写之后就已经重新制作了,我在调整他的时候遇到了一些意想不到的结果。用于处理当前版本的代码。 (请注意,我不需要帮助重写代码,我只是想知道为什么会发生这里发生的事情)

具体来说,无论我试图用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

那么,为什么有效地址会返回301 Moved Permanently?不仅如此,而且实际上试图遵循该重定向(在该教程的范围内无用,因为整点都是跳过任何不是2xx的东西),这里建议Ruby Net::HTTP - following 301 redirects给我一个404,大概是因为重定向链接有一个尾随斜线。

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

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

如果有人带我走过这里发生的一切,我将非常感激。感谢您的帮助,并提前抽出时间。

ruby redirect web-scraping web-crawler http-status-code-301
1个回答
0
投票

它似乎不像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似乎是一些丢失数据的网址,但https://www.defense.gov/News/Contracts/Contract-View/Article/1403876/工作正常(实际为26.17.2017 03:24 +7)。为什么你认为ID为14038760的网址有效?

我发现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/获取实际合同列表,然后请求每个合同分开请求。

© www.soinside.com 2019 - 2024. All rights reserved.