【问题标题】:Reddit API returning useless JSONReddit API 返回无用的 JSON
【发布时间】:2012-10-30 23:54:38
【问题描述】:

我正在尝试使用 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,我会得到我想要的。

【问题讨论】:

  • The API link 提供给我相同的数据,{"kind": "Listing", "data": {"modhash": "", "children": [], "after": null, "before": null}}。您确定您正确使用 API 吗?
  • 你确定你没有打印出你解析的 JSON 数据吗?
  • @Tim -- 这很奇怪,因为我得到了this。我不得不将限制更改为 10,因为 100 浪费太大而无法容纳馅饼。
  • @icktoofay -- 来自打印 _json。
  • @JamesBrewer:我不知道为什么,我以前没有使用过这个 API。希望其他人可以阐明它。

标签: python urllib2 reddit


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    编辑:自 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更新。

    在相关说明中,我强烈建议您使用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() 部分。

    【讨论】:

    • 如何绕过 PRAW 在停止前只返回 1000 个结果?
    • 1000 项限制是 reddit 限制而不是 PRAW 限制。唯一的例外(我知道)是上面显示的/r/all/new?sort=new 列表。我刚刚确认使用 r.get_subreddit('all').get_new_by_date(limit=2000) 实际上会获取 2000 个项目。将limit=2000 替换为limit=None 以继续回到reddit 的开头。
    • 我爱你@bboe!两天来我一直在想办法弄清楚为什么我只能获得前 800 个子目录的列表。为什么我只能在对 SO 的评论中找到这个,而不是在文档中?!
    • 如果您指的是 1000 项限制,则在文档中的两个地方提到:praw.readthedocs.org/en/latest/pages/…praw.readthedocs.org/en/latest/pages/…
    • 哦,你的意思是 reddit API 文档。也许我会添加它。
    【解决方案3】:

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

    http://reddit.com/r/all/new?limit=100 (no .json) 表示没有项目...

    reddit 看起来不像你认为的那样使用 /new,所以问题在于你对 api 的使用。

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

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

    【讨论】:

    • 这两个 URL 指向完全不同的数据。第一个用于 /r/all 中的“热门”帖子,第二个用于“新”帖子。
    • 没有。第二个指向根本没有帖子......当然它们是不同的。
    • 是的。我看到了。我在他面前回答,所以我没看到。没错,我是在指出错误的根源绝对不是 Python,并为将来调试此类问题提供了提示。
    猜你喜欢
    • 2017-06-19
    • 2020-12-25
    • 2020-12-05
    • 2015-04-14
    • 2013-07-27
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多