5

我正在尝试使用他们的 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的示例页面。

这是怎么回事?

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

4

3 回答 3

3

编辑:截至 2013 年 2 月 22 日,new不再需要将所需的排序sort=new添加为 URL 参数。这是因为在路由rising下不再提供排序/new,而是由/rising[ source ]提供。


URL 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 更新。

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

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

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

于 2012-11-11T07:36:04.640 回答
0

有一段时间我被类似(与 OP 不同)的问题难住了——APIchildren响应中没有。我想我会发布这个,以防其他人通过搜索引擎解决这个问题:

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

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

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

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

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

于 2018-03-08T23:06:52.650 回答
-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 认为您要求的信息。

于 2012-11-11T07:20:35.363 回答