如何使用Ruby刮掉TMDB?得到未定义的方法`[]'为nil:NilClass错误

时间:2016-02-17 16:58:02

标签: ruby api

我已经获得了一系列电影,并且我试图抓住TheMovieDatabase.org(TMDB)来返回每个电影的ID(只是一个例子,我打算检索更多信息,但我的代码在这一点上失败了。)

我正在使用gem themoviedb(https://github.com/ahmetabdi/themoviedb),我已经获得了一系列IMDB电影ID(大约10,000部电影),我正在迭代并执行对每个API进行API调用,如下所示:

imdb_id = ["tt0114709", "tt0113497", "tt0107050", "tt0114885", "tt0113041", "tt0113277" (etc...)]

imdb_id.each do |id|
    result = Tmdb::Find.imdb_id(id)
    p result['movie_results'][0]["id"]
end

但是,经过多次迭代后,代码失败并出现此错误:

`block in <main>': undefined method `[]' for nil:NilClass (NoMethodError)

有时它会在第40个ID(最常见),第88个ID或第109个ID上失败。这些ID和在数组中成功的任何其他ID之间没有什么不同,如果我单独查询它,它可以正常工作:

result = Tmdb::Find.imdb_id(imdb_id[41])
p result['movie_results'][0]["id"]

Tmdb::Find.imdb_id(imdb_id[41])的JSON结果如下所示(我删除了一些我不会因可读性而使用的数据):

{  
   "movie_results"   =>   [  
      {  
         "adult"         =>false,
         "id"         =>11443
      }
   ]
}

我真的很困惑导致问题的是什么。我应该在API调用之间有一些延迟吗?这甚至是在Ruby中执行大量API调用的最佳方法吗?

修改

在JSON中发现此错误:"status_message"=>"Your request count (41) is over the allowed limit of 40."}。我需要在我的代码中实现一个限制......

1 个答案:

答案 0 :(得分:1)

当您通过多个级别访问某个属性时,假设它们都存在,并且当它们不存在时将会出错。这个片段,例如:

result['movie_results'][0]["id"]

如果result['movie_results']不是一个数组,或者它是一个数组但是是空的,或者是一个Hash以外的东西,那么它将会爆炸并出现异常。

更安全的方法是:

result['movie_results'] && result['movie_results'][0] && result['movie_results'][0]["id"]

经常这样做非常烦人,所以你可能想要编写一个仔细digs down的方法来寻找你正在寻找的价值。