2012-11-03 25 views
8

तो मेरे पास उप-reddits की एक सूची है और मैं उन्हें खोलने के लिए urllib का उपयोग कर रहा हूँ।urllib2 HTTP त्रुटि 42 9

कोई और अधिक एक हर दो सेकंड से अनुरोध करें: कुछ शोध मैंने पाया कि reddit आईपी द्वारा अपने सर्वर के लिए अनुरोध की राशि की सीमा कर

urllib2.HTTPError: HTTP Error 429: Unknown 

: मैं उन के माध्यम से जाना के रूप में अंत में urllib के साथ विफल । अनुरोधों के विस्फोटों के लिए कुछ भत्ता है, लेकिन इसे शांत रखें। आम तौर पर, इसे एक मिनट में 30 से अधिक अनुरोधों पर रखें।

तो मुझे लगा कि मैं प्रत्येक 10 सेकंड में एक पृष्ठ पर अपने अनुरोधों को सीमित करने के लिए time.sleep() का उपयोग करूंगा। यह भी असफल हो जाता है।

ऊपर उद्धरण reddit API पृष्ठ से लिया गया है। मैं reddit एपीआई का उपयोग नहीं कर रहा हूँ। इस बिंदु पर मैं दो चीजें सोच रहा हूँ। या तो वह सीमा केवल Reddit API या urllib पर लागू होती है, इसकी सीमा भी होती है।

क्या किसी को पता है कि इनमें से कौन सी चीजें हैं? या मैं इस मुद्दे के आसपास कैसे जा सकता हूं?

+3

'urllib2' में कोई सीमा नहीं है, जैसा कि आप किसी अन्य वेबपृष्ठ को आजमाकर देख सकते थे। हो सकता है कि उन्होंने आपके आईपी को एपीआई एक्सेस से अवरुद्ध कर दिया हो, उन्हें एक ईमेल भेजने का प्रयास करें। –

+0

@ लार्समैन Reqeusts यादृच्छिक रूप से गुजरते हैं। मुझे कुछ मिलता है तो यह थोड़ी देर के लिए विफल रहता है और फिर यह फिर से काम करता है। इसके अलावा वे मुझे अपने एपीआई से अवरुद्ध नहीं कर सका क्योंकि मैं उनके एपीआई का उपयोग नहीं कर रहा हूं। –

उत्तर

16

https://github.com/reddit/reddit/wiki/API से:

कई डिफ़ॉल्ट उपयोगकर्ता-एजेंट ("पायथन/urllib" या "जावा" की तरह) काफी अनोखी और वर्णनात्मक उपयोगकर्ता के एजेंट स्ट्रिंग प्रोत्साहित करने के लिए सीमित हैं।

यह नियमित अनुरोधों पर भी लागू होता है। अनुरोध करते समय आपको अपने स्वयं के उपयोगकर्ता एजेंट शीर्षलेख की आपूर्ति करने की आवश्यकता है।

#TODO: change user agent string 
hdr = { 'User-Agent' : 'super happy flair bot by /u/spladug' } 
req = urllib2.Request(url, headers=hdr) 
html = urllib2.urlopen(req).read() 

हालांकि, यह प्रत्येक अनुरोध के लिए एक नया कनेक्शन बनाएगा। मैं एक और लाइब्रेरी का उपयोग करने का सुझाव देता हूं जो कनेक्शन का पुनः उपयोग करने में सक्षम है, httplib या Request, उदाहरण के लिए। यह सर्वर पर कम दबाव डाल दिया और अनुरोध को गति देगा:

import httplib 
import time 

lst = """ 
science 
scifi 
""" 

hdr= { 'User-Agent' : 'super happy flair bot by /u/spladug' } 
conn = httplib.HTTPConnection('www.reddit.com') 
for name in lst.split(): 
    conn.request('GET', '/r/'+name, headers=hdr) 
    print conn.getresponse().read() 
    time.sleep(2) 
conn.close() 
+0

यह काम करने के लिए एकमात्र कारण है क्योंकि आप एक आम उपयोगकर्ता-एजेंट का उपयोग नहीं कर रहे हैं। एपीआई नियमों के अनुसार, आपको अभी भी एक अद्वितीय उपयोगकर्ता-एजेंट सेट करने की आवश्यकता है और यह समाधान अंततः आपको 42 9 त्रुटियों को प्राप्त करने का कारण बन सकता है। – bboe

+0

मेरे झूठे मूल्यांकन को सही करने के लिए धन्यवाद। मैंने इसे प्रतिबिंबित करने के लिए अपना जवाब बदल दिया है। –

4

reddit दोनों IP पते और उपयोगकर्ता एजेंट के लिए अनुरोध के द्वारा सीमित दर (कायर बेनामी द्वारा suggested के रूप में नहीं कनेक्शन) करता है। जिस मुद्दे पर आप चल रहे हैं वह यह है कि जो भी urllib2 का उपयोग करके reddit तक पहुंचने का प्रयास करता है वह एक ही उपयोगकर्ता के रूप में सीमित दर होगी।

समाधान एक उपयोगकर्ता एजेंट सेट करना है जिसे आप this question में उत्तर दे सकते हैं।

वैकल्पिक रूप से, Reddit को क्रॉल करने और PRAW instead का उपयोग करने के लिए अपना स्वयं का कोड लिखना छोड़ दें। यह रेडडिट एपीआई की लगभग सभी सुविधाओं का समर्थन करता है और आपको किसी भी एपीआई नियमों का पालन करने की चिंता करने की आवश्यकता नहीं है क्योंकि यह आपके लिए इसका ख्याल रखता है।

+0

धन्यवाद बोबो।मैंने आपको रेडडिट आईआरसी पर पकड़ा और आपने मुझे पावर के बारे में बताया। चीयर्स फिर से। –