5

Reddit の API と Python の urllib2 を使用して新しい記事を収集しようとしていますが、次のような 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 のページの例を次に示します。

どうしたんだ?

EDIT別のブラウザーでサンプル ページを読み込もうとした後、ページの上部に投稿した JSON も表示されます。ただし、 //new.json のみのようです。//hot.json または /.json だけを試すと、必要なものが得られます。

4

3 に答える 3

3

編集: 2013/02/22 の時点で、目的の並べ替えを URL パラメーターとして追加newする必要がなくなりました。sort=newこれは、並べ替えがルートrisingの下で提供されなくなったためですが、 [ source ] によって提供されます。/new/rising


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 に答える
-1

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 があなたが求めていると考える情報が表示されます。

于 2012-11-11T07:20:35.363 に答える