2014-03-12 30 views
1

我试图用机械化来获取特定的页面:机械化返回500有效的URL?

require 'mechanize' 

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

,但我得到这个:

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

而页面将在浏览器中打开罚款。为什么?

+0

我用'wget'并得到了这一点: --2014-03-12 09:30:43-- HTTP:// formitas .si/ 正在解析formitas.si(formitas.si)... 212.44.99.132 正在连接formitas.si(formitas.si)| 212.44.99.132 |:80 ...已连接。 发送HTTP请求,等待响应... 500内部服务器错误 2014-03-12 09:30:44错误500:内部服务器错误。 – squiguy

+0

标题有误导性。问题不在于机械化返回错误,它只是报告问题的信使。服务器在Mechanize请求的有效URL上返回500。 –

+0

我尝试卷曲,它的工作......所以卷曲的作品和wget /机械不要...... – davidhq

回答

0

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

这里的HTTP请求诊断101:

考虑什么是浏览器之间的不同和机械化,一个服务器可以感觉到。您已获取请求URL本身以及作为HTTP请求一部分发送的标头。

URL本身很容易进行可视化检查,因此如果您确认它在Mechanize和浏览器中都是相同的,则可以立即排除该URL。

这会留下标题。使用工具来检查您的浏览器发送了哪些标题,然后查看您使用的机械化。让他们匹配。

根据经验,我怀疑这是浏览器的签名,或可接受的数据类型,浏览器和机械化之间的不同,以及该网站不知道如何处理这两者之一。

+0

是的,谢谢你...但有趣的是,卷曲不起作用而wget和Mechanize不会...也非常有趣的上述答案,使机械化工作通过直接连接到IP地址...我们可以从这些结论呢?我还不知道。 – davidhq

+0

我得出结论,他们正在嗅探签名并基于这些签名进行禁止。他们可能会允许cURL,因为他们知道它是什么。 –

+0

他们实际上也返回到Chrome浏览器(见上) – davidhq

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}> 
+0

有趣的.... – davidhq

+0

但是当试图获取除根页面之外的东西时,这种方法是没有用的...... :(如果这个工作正常的方法返回500错误,在Mechanize中似乎被破坏了:/ – davidhq

+0

哇,你现在想要抓取其他页面?!这不在描述中!但是,除了所有讽刺之外,我认为我不能提供更多的帮助。站点不希望你经常刮擦它们,这很可能不是一个机械化问题,而是站点本身采取的预防措施。快速编辑:你最好使用一个完整的浏览器模拟器,如Watir/Selenium如果你在网站上有机械化问题,他们实际上处理Javascript,所以如果数据是以这种方式加载的,那么你可以真正得到它 –