0

我正在编写一个有趣的应用程序供我使用。在这个应用程序中,我将 URL 放入经典的 POST 表单中,从中提取一些信息。例如,这一行是我提取页面标题的地方:

self.name = Nokogiri::HTML(open(self.url)).css('title').to_s.sub('<title>','').to_s.sub('</title>','')

我正在使用 Nokogiri (v1.5.4) 从源页面解析数据。我不知道我是否在这里遗漏了什么,但应用程序的行为很奇怪。

如果我在我的机器上的开发环境中的本地主机上运行,​​一切正常并且在我看来还不错。但是,在推动 Heroku 之后,出现了一些问题。例如,来自 StackOverflow 的 URL总是有这种类型的错误:

OpenURI::HTTPError (503 Service Unavailable):
app/models/url.rb:67:in `set_name'
app/controllers/urls_controller.rb:48:in `block in create'
app/controllers/urls_controller.rb:46:in `create'

我不明白为什么它只发生在 Heroku 上。在我的本地机器上,它可以完美地使用相同的 URL。我可能遗漏了 Heroku 的某些内容,但其他 URL 正在返回正常的 200 状态并且工作正常。它只是来自 StackOverflow 的 URL。

4

1 回答 1

1

不要使用:

.to_s.sub('<title>','').to_s.sub('</title>','')

而是使用:

.text

例如:

html = '<head><title>foo</title></head>'
Nokogiri::HTML(html).css('title').text

在 IRB 中:

irb(main):055:0> html = '<head><title>foo</title></head>'
"<head><title>foo</title></head>"
irb(main):056:0> Nokogiri::HTML(html).css('title').text
"foo"

为什么 StackOverflow 的 URL 在 Heroku 上失败并出现 503 失败可能是路由或托管问题,因为您得到的是 503。

您可能需要考虑“ Stack Overflow 的公共数据转储在哪里? ”和“ Stack Overflow 知识共享数据转储”,而不是抓取页面。

于 2012-07-27T17:17:20.277 回答