如何从Twitter宝石中获取更多记录?

时间:2014-08-20 21:35:07

标签: ruby twitter

我试图了解Twitter宝石的分页是如何运作的。

我已经尝试了max_idcursor,但他们都奇怪地无法工作。

基本上我可以从搜索结果中获得的最大值是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是私有方法,任何人都有工作解决方案吗?

3 个答案:

答案 0 :(得分:1)

如果不知道您引用的是哪个宝石(请指定网址),我会毫不犹豫地说cursormax_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是私有的,因为它们试图为枚举提供统一的接口。

看,在search_results.rb

中包含了Twitter :: Enumerable
module 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