我试图了解Twitter宝石的分页是如何运作的。
我已经尝试了max_id
和cursor
,但他们都奇怪地无法工作。
基本上我可以从搜索结果中获得的最大值是100,我想获得500。
当前代码:
max_page = 5
max_id = -1
@data = []
for i in (1..max_page)
t = twt_client.search("hello world", :count => 100, :result_type => :recent, :max_id => max_id)
t.each do | tweet |
@data << tweet
end
max_id = t.next_results[:max_id]
end
这实际上告诉我next_results
是私有方法,任何人都有工作解决方案吗?
答案 0 :(得分:1)
如果不知道您引用的是哪个宝石(请指定网址),我会毫不犹豫地说cursor
和max_id
无法获得您想要的内容。但是count
会。由于您说您只检索了100个结果而count
设置为100
,这对我来说是有意义的。
t = twt_client.search("hello world", :count => 500, :result_type => :recent, :max_id => max_id)
我假设您正在谈论引用here的Twitter客户端。我的第一个问题是:什么是twt_client
,就此而言,search
方法返回了什么?您也可能无意中更新了宝石,而且还有一个代码库更改,使您当前的脚本过时。
查看已安装的gem版本,再看看自述文件here。
答案 1 :(得分:1)
Twitter :: SearchResults#next_results是私有的,因为它们试图为枚举提供统一的接口。
中包含了Twitter :: Enumerablemodule Twitter class SearchResults include Twitter::Enumerable ... private def last? !next_page? end ... def fetch_next_page response = @client.send(@request_method, @path, next_page).body self.attrs = response end ... end end
如果您查看enumerable.rb,您会看到该方法的Twitter :: SearchResults#last?和Twitter :: SearchResults#fetch_next_page由Twitter :: SearchResults#每种方法使用
module Twitter module Enumerable include ::Enumerable # @return [Enumerator] def each(start = 0) return to_enum(:each, start) unless block_given? Array(@collection[start..-1]).each do |element| yield(element) end unless last? start = [@collection.size, start].max fetch_next_page each(start, &Proc.new) end self end ... end end
Twitter :: SearchResults#每个都会遍历页面,直到Twitter的响应中出现@attrs [:search_metadata] [:next_results]。因此,在您达到第500个元素之后,您需要打破迭代。
我认为你只需要使用每个
@data = []
tweet_number = 1
search_results = twt_client.search("hello world", count: 100, result_type: :recent)
search_results.each do |tweet|
@data << tweet
break if tweet_number == 500
end
这篇文章是关注宝石资源和Twitter的api的结果。我可能在某个地方犯了一个错误,因为我还没有在控制台中查看我的想法。
答案 2 :(得分:1)
试试这个(我基本上只更新了循环中max_id
的计算):
max_page = 5
max_id = -1
@data = []
for i in (1..max_page)
t = twt_client.search("hello world", :count => 100, :result_type => :recent, :max_id => max_id)
t.each do | tweet |
@data << tweet
end
max_id = t.to_a.map(&:id).max + 1 # or may be max_id = t.map(&:id).max + 1
end