机械化在有效URL上返回500?

时间:2014-03-12 16:25:33

标签: ruby mechanize mechanize-ruby

我正在尝试使用Mechanize获取特定页面:

require 'mechanize'

agent = Mechanize.new
p agent.get("http://formitas.si")

但我明白了:

`fetch': 500 => Net::HTTPInternalServerError for http://formitas.si/ -- unhandled response (Mechanize::ResponseCodeError)

页面在浏览器中正常打开。为什么呢?

2 个答案:

答案 0 :(得分:0)

这是服务器上的问题。这很容易辨别,因为这是一个500系列错误。

这是HTTP请求诊断101:

考虑一下服务器可以感知的浏览器和Mechanize之间会有什么不同。您已获得请求URL本身以及作为HTTP请求的一部分发送的标头。

网址本身很容易直观检查,因此如果您确认它在Mechanize和浏览器中都是相同的,则可以立即排除。

留下标题。使用工具检查浏览器发送的标头,然后查看您使用Mechanize的内容。让它们匹配。

根据经验,我怀疑浏览器的签名或可接受的数据类型在浏览器和Mechanize之间存在差异,并且该网站不知道如何处理其中一个。

答案 1 :(得分:0)

在过去,我遇到了一个问题,因为Mechanize无法解析DNS本身。

虽然我很确定Mechanize使用Resolv来获取底层网站,但我也无法让agent.get('http://formitas.si')工作。

相反,我所做的是显式访问Resolv库并将IP设置为我访问的内容而不是主机名。

require 'mechanize'
require 'Resolv'

@agent = Mechanize.new
address = Resolv.getaddress "formitas.si"
page = @agent.get('http://' + address.to_s) # wouldn't let me use string interpolation on SO

pp page

最终给了我这个:

#<Mechanize::Page
 {url #<URI::HTTP:0x007f7f93ec7c68 URL:http://212.44.99.132/>}
 {meta_refresh}
 {title nil}
 {iframes}
 {frames}
 {links #<Mechanize::Page::Link "" "http://www.parallels.com/plesk/">}
 {forms}>