2012-11-11 13 views
5

मैं उनके एपीआई और पायथन के urllib2 का उपयोग कर रेडिट से नई कहानियों को स्क्रैप की कोशिश कर रहा हूँ, लेकिन मैं इस तरह JSON दस्तावेज़ प्राप्त करते रहने के:रेडिट एपीआई लौटने बेकार 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) 

जो मैंने लिखा है वह काफी छोटा और सीधा-आगे है, लेकिन मैं स्पष्ट रूप से कुछ देख रहा हूं या मुझे एपीआई की पूरी समझ नहीं है या urllib2 कैसे काम करता है।

एपीआई से example page यहां है।

क्या सौदा है?

संपादित करें किसी अन्य ब्राउज़र में उदाहरण पृष्ठ लोड करने का प्रयास करने के बाद, मैं पेज के शीर्ष पर जेएसओएन पोस्ट भी देख रहा हूं। ऐसा लगता है कि यह केवल //new.json के लिए है। अगर मैं //hot.json या बस/json कोशिश करता हूं, तो मुझे वह चाहिए जो मैं चाहता हूं।

+1

[एपीआई लिंक] (http://www.reddit.com/r/all/new.json?limit=100) प्रदान किया गया मुझे एक ही डेटा देता है, '{" दयालु ":" लिस्टिंग "," डेटा ": {" मोडशैश ":" "," बच्चे ": []," बाद ": शून्य," पहले ": शून्य}}'। क्या आप वाकई एपीआई का सही इस्तेमाल कर रहे हैं? – Tim

+0

क्या आप वाकई अपने पार्स किए गए JSON डेटा को प्रिंट नहीं कर रहे हैं? – icktoofay

+0

@ टिम - यह अजीब बात है, क्योंकि मुझे [यह] मिलता है (http://pastie.org/5359171)। मुझे सीमा को 10 तक बदलना पड़ा क्योंकि पेस्टी के लिए 100 अपशिष्ट बहुत बड़ा था। –

उत्तर

3

संपादित: 2013/02/22 के रूप में, वांछित new तरह नहीं रह गया है sort=new एक URL पैरामीटर के रूप में जोड़ने की आवश्यकता है। ऐसा इसलिए है क्योंकि 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/सभी के लिए अपडेट नहीं किया गया है।

संबंधित नोट पर, यदि आप एपीआई के केवल एक हिस्से से अधिक उपयोग करने की योजना बनाते हैं तो मैं अपने कोड लिखने के बजाय PRAW (पायथन रेडडिट एपीआई रैपर) का उपयोग करने का दृढ़ता से सुझाव देता हूं।

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

आप बस प्रस्तुतियाँ से अधिक पुनरावृति करना चाहते हैं आप list() भाग को छोड़ सकते हैं: यहाँ प्रासंगिक कोड है कि आप चाहते हैं।

+0

मैं केवल पीआरएडब्ल्यू को रोकने से पहले 1000 परिणामों को वापस कैसे प्राप्त करूं? –

+2

1000 आइटम सीमा एक लाल सीमा है जो एक पावर सीमा नहीं है। एकमात्र अपवाद (मुझे पता है) ऊपर दिखाए गए '/ r/all/new? Sort = new' लिस्टिंग के लिए है। मैंने अभी पुष्टि की है कि 'r.get_subreddit (' all ') का उपयोग कर। Get_new_by_date (limit = 2000)' वास्तव में 2000 आइटम लाएगा। Reddit की शुरुआत में जारी रखने के लिए 'सीमा = कोई भी 'सीमा = कोई नहीं' के साथ बदलें। – bboe

+0

मैं तुमसे प्यार करता हूँ @bboe! मैं एक दीवार के खिलाफ अपना सिर मार रहा हूं, दो दिन पहले ही यह पता लगाने की कोशिश कर रहा हूं कि मैं केवल subreddit के लिए पहली ~ 800 प्रविष्टियां क्यों प्राप्त कर सकता हूं। मैं इसे SO पर टिप्पणी में क्यों ढूंढ सकता हूं, न कि दस्तावेज़ों में ?! – msrxthr

-1

http://www.reddit.com/r/all.json?limit=100 रिटर्न सार्थक डेटा

http://reddit.com/r/all/new?limit=100 (कोई .json) का कहना है कोई आइटम नहीं देखते हैं ...

ऐसा लगता है कि reddit नया प्रयोग नहीं करता है की तरह/आप कैसे लगता है कि यह करता है तो समस्या में है एपीआई का उपयोग

यदि यह उत्तर पर्याप्त नहीं है तो कृपया reddit api दस्तावेज़ों के लिए एक लिंक शामिल करें।

इसके अलावा, यहां आरईएसटी पर एक त्वरित नोट है। ऐसा लगता है कि रेडडिट रीस्टफुल है (मुझे सही करने के लिए खड़ा है, लेकिन यही मेरे प्रयोग यहां मुझे बताते हैं ...)। इसका मतलब है कि किसी भी यूआरएल पर .json एक्सटेंशन को छोड़कर आप एक्सेस करने का प्रयास कर रहे हैं, आपको उसी डेटा के मानव-अनुकूल संस्करण देना चाहिए। परीक्षण के दौरान यह उपयोगी हो सकता है। बस अपने ब्राउज़र के साथ सामान देखें और आप देखेंगे कि लालडिट क्या जानकारी मांगती है जो आप पूछ रहे हैं।

+0

उन दो यूआरएल पूरी तरह से अलग डेटा को इंगित करते हैं। पहला/आर/सभी में "गर्म" पदों के लिए है, और दूसरा "नई" पोस्ट के लिए है। –

+0

संख्या। दूसरा अंक बिल्कुल कोई पोस्ट नहीं है ... बेशक वे अलग हैं। – Sheena

+0

@ bboe anser देखें। –

0

मैं एपीआई प्रतिक्रिया में समान (ओपी के समान नहीं) समस्या पर फंस गया था - एपीआई प्रतिक्रिया में children नहीं। मुझे लगता है मैं पोस्ट होता इस मामले में यह एक खोज इंजन के माध्यम से इस सवाल के लिए हो रही दूसरों के लिए उपयोगी है सोचा:

अगर मैं अपने ब्राउज़र में इस URL खोलें:

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

यह ठीक से काम करने लगता है, लेकिन जब मैं एक अनुरोध भेजता हूं तो यह कोई बच्चा नहीं देता है। अनुरोध के उपयोगकर्ता-एजेंट के साथ खेलना और इस तरह की चीजें का कोई फायदा नहीं हुआ। ब्राउज़र और एक कार्यक्रम संबंधी अनुरोध के माध्यम से में

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

वर्क्स ठीक: बजाय /r/all टिप्पणी स्ट्रीम का उपयोग कर समाप्त हो गया। अभी भी कोई जानकारी नहीं है कि पहला यूआरएल क्यों काम नहीं करता है।

संबंधित मुद्दे