2016-12-31 12 views
7

मैं वेबपृष्ठों की एक श्रृंखला को स्क्रैप करने की कोशिश कर रहा हूं लेकिन मुझे छेद मिल गया है, कभी-कभी ऐसा लगता है कि वेबसाइट HTML प्रतिक्रिया को सही तरीके से भेजने में विफल रही है। इसके परिणामस्वरूप सीएसवी आउटपुट फ़ाइल में खाली रेखाएं होती हैं। जब अनुरोध पर xpath चयनकर्ता खाली होता है तो अनुरोध और पार्स को बार बार पुनः प्रयास करने के लिए कोई कैसे करेगा? ध्यान दें कि मेरे पास कोई HTTP त्रुटियां नहीं हैं।किसी आइटम को रिक्त फ़ील्ड मिलने पर अनुरोध n बार फिर से प्रयास कैसे करें?

उत्तर

11

आप कोई कस्टम पुन: प्रयास करें Middleware के साथ ऐसा कर सकता है देखें, तो आप सिर्फ वर्तमान Retry Middleware की process_response विधि ओवरराइड करने के लिए की जरूरत है:

from scrapy.downloadermiddlewares.retry import RetryMiddleware 
from scrapy.utils.response import response_status_message 


class CustomRetryMiddleware(RetryMiddleware): 

    def process_response(self, request, response, spider): 
     if request.meta.get('dont_retry', False): 
      return response 
     if response.status in self.retry_http_codes: 
      reason = response_status_message(response.status) 
      return self._retry(request, reason, spider) or response 

     # this is your check 
     if response.status == 200 and response.xpath(spider.retry_xpath): 
      return self._retry(request, 'response got xpath "{}"'.format(spider.retry_xpath), spider) or response 
     return response 

फिर settings.py में डिफ़ॉल्ट RetryMiddleware की यह बजाय सक्षम :

DOWNLOADER_MIDDLEWARES = { 
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None, 
    'myproject.middlewarefilepath.CustomRetryMiddleware': 550, 
} 

अब आपके पास एक मिडलवेयर है जहां आप सह कर सकते हैं xpath Nfigure विशेषता retry_xpath के साथ अपने मकड़ी के अंदर फिर से प्रयास करना:

class MySpider(Spider): 
    name = "myspidername" 

    retry_xpath = '//h2[@class="tadasdop-cat"]' 
    ... 

यह आवश्यक रूप से पुन: प्रयास नहीं होगा जब अपने आइटम के फ़ील्ड रिक्त है, लेकिन आप इसे बनाने के लिए इस retry_xpath विशेषता में उस क्षेत्र के एक ही पथ निर्दिष्ट कर सकते हैं काम।

+0

क्या आप मुझे बता सकते हैं कि 'self._retry' क्या है, यह जांच है कि xpath खाली है या नहीं और मुझे अपने स्पाइडर के नाम को तीसरे तर्क के लिए' process_response' 'देने की आवश्यकता क्यों नहीं है? धन्यवाद – ChiseledAbs

+0

अपने स्वयं के [डाउनलोडर मिडलवेयर] (https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#downloader-middleware) बनाने का तरीका देखें। _retry और अन्य वर्ग विधियों के बारे में, याद रखें कि हम RetryMiddleware से विरासत में हैं, इसलिए हम इसके तरीकों को ओवरराइड कर रहे हैं (उत्तर में लिंक)। मकड़ी तर्क के बारे में, यह वर्तमान मकड़ी उदाहरण है, नाम की कोई आवश्यकता नहीं है। – eLRuLL

+0

ठीक है धन्यवाद। अगर मैं len (response.xpath (spider.retry_xpath)) == 0' के साथ किसी भी कारण से ऐसा क्यों नहीं किया है, तो मैं btw को प्रतिस्थापित करता हूं। प्रतिक्रिया = status == 200 और respond.xpath (spider.retry_xpath) ' – ChiseledAbs

1

आप settings.py में सेटिंग को जितनी बार चाहें उतनी बार रेट कर सकते हैं। यह 2 गुना डिफ़ॉल्ट है।

more on RetryMiddleware

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