Reddit搜索API没有给出所有结果

时间:2015-06-23 10:56:23

标签: python python-2.7 praw

import praw

def get_data_reddit(search):
    username=""
    password=""
    r = praw.Reddit(user_agent='')
    r.login(username,password,disable_warning=True)
    posts=r.search(search, subreddit=None,sort=None, syntax=None,period=None,limit=None)
    title=[]
    for post in posts:
        title.append(post.title)
    print len(title)


search="stackoverflow"
get_data_reddit(search)
  

输出继电器= 953

为什么有限制?

  1. Documentation提及
  2.   

    我们最多可以从每个列表中获得1000个结果,这是一个   reddit的上游限制。我们无能为力   这个限制。但是我们也许能够得到我们想要的结果   而是搜索()方法。

    任何解决方法?我希望在API中能够克服,我为twitter数据编写了一个剪贴簿,并发现它不是最有效的解决方案。

    同一问题:https://github.com/praw-dev/praw/issues/430 请参考上述链接进行相关讨论。

2 个答案:

答案 0 :(得分:8)

限制搜索或列表上的结果是减少服务器负载的常用策略。 reddit API很明显,它就是它所做的(因为你已经标记过了)。但它并不止于此......

API还支持列表的分页结果的变体。由于它是一个不断变化的数据库,它们不提供页面,而是允许您通过使用'之后的#39;来提取您停止的位置。参数。记录在案here

现在,虽然我不熟悉PRAW,但我发现reddit search API符合列表语法。因此,我认为您只需要重新发布您的搜索内容,并指定额外的'之后'参数(指第一次搜索的最后结果)。

随后尝试了它,PRAW似乎真正地回复了你要求的所有结果。

根据OP的要求,这里是我编写的用于查看分页结果的代码。

import praw

def get_data_reddit(search, after=None):
    r = praw.Reddit(user_agent='StackOverflow example')
    params = {"q": search}
    if after:
        params["after"] = "t3_" + str(after.id)
    posts = r.get_content(r.config['search'] % 'all', params=params, limit=100)
    return posts

search = "stackoverflow"
post = None
count = 0
while True:
    posts = get_data_reddit(search, post)
    for post in posts:
        print(str(post.id))
        count += 1
    print(count)

答案 1 :(得分:0)

所以我只是循环一组预定的搜索查询,我假设句号是一个时间段?我也不确定它的格式是什么,所以下面很大程度上是弥补的,但是你应该得到主旨。

在这种情况下,它将类似于以下

import praw

def get_data_reddit(search):
    username=""
    password=""
    r = praw.Reddit(user_agent='')
    r.login(username,password,disable_warning=True)
    title=[]

    periods = (time1, time2, time3, time4)  # declare a set of times to use in the search query to limit results

    for period in periods:  # loop through the different time points and query the posts from that time.
        posts=r.search(search, subreddit=None,sort=None, syntax=None,period=None,limit=None)  # this now returns a limited search query.

        for post in posts:
            title.append(post.title)  # and append as usual.
    print len(title)


search="stackoverflow"
get_data_reddit(search)