मैं वेबपृष्ठों की एक श्रृंखला को स्क्रैप करने की कोशिश कर रहा हूं लेकिन मुझे छेद मिल गया है, कभी-कभी ऐसा लगता है कि वेबसाइट HTML प्रतिक्रिया को सही तरीके से भेजने में विफल रही है। इसके परिणामस्वरूप सीएसवी आउटपुट फ़ाइल में खाली रेखाएं होती हैं। जब अनुरोध पर xpath चयनकर्ता खाली होता है तो अनुरोध और पार्स को बार बार पुनः प्रयास करने के लिए कोई कैसे करेगा? ध्यान दें कि मेरे पास कोई HTTP त्रुटियां नहीं हैं।किसी आइटम को रिक्त फ़ील्ड मिलने पर अनुरोध n बार फिर से प्रयास कैसे करें?
7
A
उत्तर
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
विशेषता में उस क्षेत्र के एक ही पथ निर्दिष्ट कर सकते हैं काम।
1
आप settings.py
में सेटिंग को जितनी बार चाहें उतनी बार रेट कर सकते हैं। यह 2 गुना डिफ़ॉल्ट है।
संबंधित मुद्दे
- 1. विफलता पर फिर से AJAX अनुरोध को फिर से प्रयास करें
- 2. किसी HTML फ़ील्ड पर फ़ोकस खो जाने पर टेक्स्ट फ़ील्ड पर फिर से फ़ोकस कैसे करें?
- 3. रिकॉर्ड फ़ील्ड पर फिर से कैसे चलें?
- 4. पाइथन में Queue.Queue आइटम को फिर से कैसे करें?
- 5. अनुरोध पर स्विफ्ट "पुनः प्रयास करें" तर्क
- 6. रूबी बड़े पैमाने पर सीमा से n वें आइटम मिल
- 7. मैं किसी शर्त पर मिलने के बिना
- 8. नेविगेशन बार पर सामान्य बार बटन आइटम कैसे सेट करें
- 9. हालत से मिलने पर $ .each फ़ंक्शन से कैसे बाहर निकलें
- 10. एक javafx सूची दृश्य पर किसी आइटम को अचयनित करें
- 11. किसी अन्य फ़ाइल पर मिलने वाले फ़ंक्शन पर कॉल कैसे करें?
- 12. स्थिति मिलने पर इकाई परीक्षण को अनदेखा कैसे करें?
- 13. rails_admin में किसी फ़ील्ड पर CKEditor को कैसे सक्षम करें?
- 14. एनएसएमयूटेबलएरे पर किसी आइटम को कैसे स्थानांतरित करें?
- 15. सूची से रिक्त तारों को कैसे निकालें, फिर सूची
- 16. एक मैच मिलने तक फ़ाइल लाइनों को छोड़ें, फिर बाकी
- 17. प्राथमिकता_क्यू पर फिर से कैसे करें?
- 18. एकाधिक फ़ील्ड को concat_ws कैसे करें और रिक्त स्लॉट
- 19. सेट से किसी आइटम को कैसे हटाएं?
- 20. ओएसएक्स: स्टेटस बार आइटम को "अनदेखा" कैसे करें?
- 21. ट्रीस्टोर को फिर से लोड कैसे करें?
- 22. स्पिनर में किसी आइटम को अक्षम कैसे करें
- 23. स्केपर: डाउनलोड त्रुटि को कैसे पकड़ें और इसे फिर से डाउनलोड करने का प्रयास करें
- 24. एक फॉर्म फ़ील्ड को फिर से सत्यापित करें कई बाधाएं
- 25. बढ़ाएँ अजवाइन पुन: प्रयास करें समय प्रत्येक फिर से प्रयास करें चक्र
- 26. मैं JMS DefaultMessageListenerContainer किसी संदेश को फिर से प्रयास करने की कितनी बार सीमित कर सकता हूं?
- 27. किसी URL में किसी चर के लिए सबडोमेन को फिर से लिखना कैसे करें?
- 28. किसी एरे से किसी आइटम को कैसे निकालें Vue.js
- 29. उत्तरदायी - किसी सूची से किसी आइटम को कैसे निकालें?
- 30. परिवर्तन देखने के लिए बार-बार फ़ायरफ़ॉक्स ब्राउज़र को फिर से खोलना बंद कैसे करें?
क्या आप मुझे बता सकते हैं कि 'self._retry' क्या है, यह जांच है कि xpath खाली है या नहीं और मुझे अपने स्पाइडर के नाम को तीसरे तर्क के लिए' process_response' 'देने की आवश्यकता क्यों नहीं है? धन्यवाद – ChiseledAbs
अपने स्वयं के [डाउनलोडर मिडलवेयर] (https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#downloader-middleware) बनाने का तरीका देखें। _retry और अन्य वर्ग विधियों के बारे में, याद रखें कि हम RetryMiddleware से विरासत में हैं, इसलिए हम इसके तरीकों को ओवरराइड कर रहे हैं (उत्तर में लिंक)। मकड़ी तर्क के बारे में, यह वर्तमान मकड़ी उदाहरण है, नाम की कोई आवश्यकता नहीं है। – eLRuLL
ठीक है धन्यवाद। अगर मैं len (response.xpath (spider.retry_xpath)) == 0' के साथ किसी भी कारण से ऐसा क्यों नहीं किया है, तो मैं btw को प्रतिस्थापित करता हूं। प्रतिक्रिया = status == 200 और respond.xpath (spider.retry_xpath) ' – ChiseledAbs