2016-12-29 173 views
0

我有一個Ruby應用程序,我想檢測某個網站上是否安裝了某段Javascript。在大多數網站是獲取本頁面用下面的代碼內容沒有問題:Ruby獲取頁面內容

user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.854.0 Safari/535.2" 
doc = Nokogiri::HTML(open(url, 'User-Agent'=>user_agent, 'read_timeout' => '10'), nil, "UTF-8") 

但在一些網站上,我得到一個網:: OpenTimeout:執行60秒後過期的錯誤。怎麼可能有一些抓取,有些不可以,我怎樣才能抓取這些網站呢?

+0

可能是由於Https連接。網站是否有SSL? – Abhinay

+0

@Abhinay沒有它沒有,而奇怪的是這個代碼是從我的本地機器上運行的,但不是來自我的數字海洋液滴 – PieterB

+0

你在DO中啓用了IPV6嗎? – Blackcoat77

回答

1

我對你提供的網址做了一些研究,儘可能多的。顯然,我使用了Heroku上託管的應用程序發佈的代碼,並且它運行良好。我沒有超時問題。它也可以從我的開發本地機器上運行,就像你的本地機器一樣。

首先,我認爲這個問題可能只在IPV6的網站,但沒有。客戶端在DNS區域中只有A記錄(IPV4),並使用共享主機。我也嘗試從我的Heroku應用發送大量請求,只是爲了檢查我的IP是否被禁止。它沒有發生。可能發生的情況是,hosting2go(zetom.nl託管公司)阻止DO IP範圍,包括您的液滴。

從這個角度來看,很難猜測會出現什麼問題。 你可以ssh到你的液滴,並嘗試:

nc -zv 83.137.194.38 80 

它應該返回

Connection to 83.137.194.38 80 port [tcp/http] succeeded!

如果你喜歡的東西:

nc: connect to 83.137.194.38 port 80 (tcp) failed: Connection timed out

大概次ere是您的防火牆的問題。

我認爲問題出在DO液滴服務器配置中。如果已經通過基於一組用戶定義的規則過濾傳入和傳出的網絡流量,我會首先檢查您的Droplet的防火牆。如果不是,我會檢查DO支持團隊,因爲他們可能會實施一些高級流量過濾。

如果您啓用了防火牆,並且您不習慣使用它,那麼您可以暫時禁用它以用於測試目的,例如(我假設您在Ubuntu上並且啓用了UFW):

sudo ufw status verbose # Check if ufw is active 

如果是積極的,你可以禁用它:

sudo ufw disable # Will disable ufw firewall 

此命令將重置雲服務器規則默認情況下,如果你需要它

sudo ufw reset 

我希望它有點作爲一個出發點:-)

+0

謝謝你這個真棒回答@ Blackcoat77。我已經嘗試過這一點,是的連接提供了一個超時。我檢查過防火牆是否啓動,但不是(需要修復)。它必須做一些配置的液滴。將試圖弄清楚什麼! – PieterB