2014-07-04 4 views
5

मेरी क्रॉलिंग के दौरान, कुछ पृष्ठ अप्रत्याशित पुनर्निर्देशन के कारण विफल रहे और कोई प्रतिक्रिया वापस नहीं आई। मैं इस तरह की त्रुटि को कैसे पकड़ सकता हूं और रीडायरेक्ट यूआरएल के साथ मूल यूआरएल के साथ अनुरोध को फिर से शेड्यूल कर सकता हूं?स्केपर: डाउनलोड त्रुटि को कैसे पकड़ें और इसे फिर से डाउनलोड करने का प्रयास करें

इससे पहले कि मैं यहां पूछूं, मैं Google के साथ बहुत सी खोज करता हूं। ऐसा लगता है कि इस समस्या को ठीक करने के दो तरीके हैं। एक डाउनलोड मध्य-बर्तन में एक अपवाद है, दूसरा स्पाइडर के अनुरोध में गलती में डाउनलोड अपवाद को संसाधित करना है। इन दो सवालों के लिए, मेरे कुछ प्रश्न हैं।

  • विधि 1 के लिए, मुझे नहीं पता कि प्रक्रिया_exception फ़ंक्शन के मूल यूआरएल को कैसे पास किया जाए। नीचे उदाहरण कोड मैंने कोशिश की है।
class ProxyMiddleware(object): 

    def process_request(self, request, spider): 
     request.meta['proxy'] = "http://192.168.10.10" 
     log.msg('>>>> Proxy %s'%(request.meta['proxy'] if request.meta['proxy'] else ""), level=log.DEBUG) 
    def process_exception(self, request, exception, spider): 
     log_msg('Failed to request url %s with proxy %s with exception %s' % (request.url, proxy if proxy else 'nil', str(exception))) 
     #retry again. 
     return request 
  • विधि 2 के लिए, मैं कैसे मकड़ी में समारोह errback के लिए बाहरी पैरामीटर पारित करने के लिए पता नहीं है। मुझे नहीं पता कि इस त्रुटि फ़ंक्शन से मूल URL को पुनर्प्राप्त करने के लिए अनुरोध को फिर से शेड्यूल करें।

class ProxytestSpider(Spider): 

    name = "proxytest" 
    allowed_domains = ["baidu.com"] 
    start_urls = (
     'http://www.baidu.com/', 
     ) 
    def make_requests_from_url(self, url): 
     starturl = url 
     request = Request(url, dont_filter=True,callback = self.parse, errback = self.download_errback) 
     print "make requests" 
     return request 
    def parse(self, response): 
     pass 
     print "in parse function"   
    def download_errback(self, e): 
     print type(e), repr(e) 
     print repr(e.value) 
     print "in downloaderror_callback" 

इस रीक्रॉल जारी करने के लिए कोई भी सुझाव अत्यधिक सराहना की है:

नीचे उदाहरण मैं विधि 2 के साथ करने की कोशिश की है। अग्रिम में धन्यवाद।

सादर

बिंग

+0

@ dabling1205, हमें दिखा तुम क्या कोशिश की है –

+0

पोस्ट एक कूड़े गंदा लग रहा है, मैं संपादित प्रारूप से परिचित यहाँ और नहीं करने के लिए नया हूँ, :) – dabing1205

उत्तर

1

आप एक errback के रूप में एक लैम्ब्डा गुजारें सकता:

request = Request(url, dont_filter=True,callback = self.parse, errback = lambda x: self.download_errback(x, url)) 

कि जिस तरह से आप errback समारोह अंदर यूआरएल का लाभ उठा सकेंगे:

def download_errback(self, e, url): 
    print url 
+0

आपके उत्तर के लिए धन्यवाद, यह अच्छी तरह से काम करता है। एक बार फिर धन्यवाद। – dabing1205

0

आप सेटिंग.py

में RETRY_HTTP_CODES को ओवरराइड कर सकते हैं

इस सेटिंग का उपयोग मैं प्रॉक्सी त्रुटियों के लिए है:

RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408] 
+1

साथी, आपके उत्तर के लिए धन्यवाद। जब आपकी स्थिति किसी स्थिति के साथ प्रतिक्रिया वापस आती है तो आपकी टिप्पणियां अच्छी तरह से काम करती हैं। :), डाउनलोड त्रुटि के लिए नहीं होता है। – dabing1205

+0

@ dabing1205 पर टिप्पणी करने के लिए धन्यवाद। क्या आप उस मामले को साझा करना चाहते हैं जहां आपको त्रुटि या अपवाद का प्रकार मिलता है? –

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