2016-12-29 168 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