我正在尝试使用Mechanize获取特定页面:
require 'mechanize'
agent = Mechanize.new
p agent.get("http://formitas.si")
但我明白了:
`fetch': 500 => Net::HTTPInternalServerError for http://formitas.si/ -- unhandled response (Mechanize::ResponseCodeError)
页面在浏览器中正常打开。为什么呢?
答案 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}>