Reddit API返回无用的JSON

时间:2012-11-11 05:18:14

标签: python urllib2 reddit

我正在尝试使用他们的API和Python的urllib2从Reddit中删除新故事,但我一直在获取像这样的JSON文档:

{ u'kind': u'Listing', u'data': { u'modhash': u'', u'children': [], u'after': None, u'before': None }}

这是我的代码:

import json
import time
import urllib2

def get_submissions(after=None):
    url = 'http://reddit.com/r/all/new.json?limit=100'
    if after:
        url += '&after=%s' % after

    _user_agent = 'Reddit Link Analysis Bot by PirateLogic @ github.com/jamesbrewer'
    _request = urllib2.Request(url, headers={'User-agent': _user_agent})
    _json = json.loads(urllib2.urlopen(_request).read())   

    return [story for story in _json['data']['children']], _json['data']['after']

if __name__ == '__main__':
    after = None
    stories = []
    limit = 1
    while len(stories) < limit:
        new_stories, after = get_submissions(after)
        stories.extend(new_stories)
        time.sleep(2) # The Reddit API allows one request every two seconds.
        print '%d stories collected so far .. sleeping for two seconds.' % len(stories)

我所写的内容相当简短直接,但我显然忽略了某些内容,或者我对API没有完全了解或者urllib2的工作原理。

以下是API中的example page

这是什么交易?

编辑尝试在另一个浏览器中加载示例页面后,我也看到了我在页面顶部发布的JSON。它似乎只适用于//new.json。如果我尝试//hot.json或只是/.json,我得到我想要的东西。

3 个答案:

答案 0 :(得分:3)

修改:截至2013/02/22,所需的new排序不再需要sort=new作为网址参数添加。这是因为rising路径下不再提供/new排序,而是由/rising [source]提供。


网址http://reddit.com/r/all/new.json?limit=100的问题在于new页面默认使用rising排序。如果您已登录,并且您已将默认排序更改为new,那么您真正看到的是页面http://reddit.com/r/all/new.json?limit=100&sort=new的结果。请注意添加参数sort=new

因此结果是正确的,只是没有为/ r / all更新上升视图。

在相关的说明中,我强烈建议使用PRAW(python reddit API包装器)而不是编写自己的代码,如果您计划使用的不仅仅是API的一部分。这是您想要的相关代码:

import praw
r = praw.Reddit('YOUR DESCRIPTIVE USER AGENT NAME')
listing = list(r.get_subreddit('all').get_new_by_date())
print listing

如果您只想迭代提交内容,可以省略list()部分。

答案 1 :(得分:0)

我在类似的(与OP不同)问题上被困了一段时间 - 在API响应中没有children。我想我会发布这个,以防其他人通过搜索引擎回答这个问题:

如果我在浏览器中打开此网址:

https://www.reddit.com/comments.json?limit=100

它似乎工作正常,但当我发送请求时,它不返回任何孩子。尝试使用请求的用户代理和类似的东西无济于事。最后使用/r/all评论流结束:

https://www.reddit.com/r/all/comments.json?limit=100

通过程序化请求在浏览器中正常工作。仍然不知道为什么第一个网址不起作用。

答案 2 :(得分:-1)

http://www.reddit.com/r/all.json?limit=100会返回有意义的数据

http://reddit.com/r/all/new?limit=100(没有.json)说没有物品......

看起来reddit没有使用/ new你认为它怎么做所以问题在于你使用api。

如果此答案不充分,请附上reddit api文档的链接。

另外,这里有一个关于REST的快速说明。看起来reddit是RESTful(我有待纠正,但这就是我在这里的实验告诉我的......)。这意味着通过在您尝试访问的任何URL上删除.json扩展名,应该为您提供相同数据的人性化版本。这在测试期间可能很有用。只需用浏览器查看内容,您就会看到reddit认为您要求的信息。