我试图获取一个特定的页面机械化:
require 'mechanize'
agent = Mechanize.new
p agent.get("http://formitas.si")
但是我得到了这个:
`fetch': 500 => Net::HTTPInternalServerError for http://formitas.si/ -- unhandled response (Mechanize::ResponseCodeError)
而页面在浏览器中正常打开。为什么?
这是服务器的问题。这很容易判断,因为这是一个500系列的错误。
下面是HTTP请求诊断101:
考虑一下服务器可以感知到的浏览器和Mechanize之间的区别。您已经获得了请求URL本身,以及作为HTTP请求的一部分发送的标头。
URL本身很容易视觉检查,所以如果你已经确认它在Mechanize和浏览器中是相同的,可以立即排除。
剩下头文件。使用工具检查浏览器发送的标题,然后查看您正在使用Mechanize的内容。让它们匹配。
根据经验,我怀疑这是浏览器的签名或可接受的数据类型在浏览器和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}>