2014-03-12 81 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,所以如果數據是以這種方式加載的,那麼你可以真正得到它 –