mime - कैसे scrap के साथ रेंगते समय कुछ फाइल प्रकार को छोड़ने के लिए?




scrapy (2)

मैं कुछ फ़ाइल प्रकार लिंक। Exe .zip .pdf को छोड़ना चाहता हूँ जबकि स्क्रेपी के साथ क्रॉल करते हुए, लेकिन विशिष्ट यूआरएल नियमित के साथ नियम का उपयोग नहीं करना चाहता। कैसे?

अद्यतन करें:

इसके कारण यह तय करना कठिन है कि क्या इस लिंक का पालन करने के लिए सिर्फ सामग्री-प्रकार के जवाब में जब शरीर डाउनलोड नहीं किया गया है। मैं डाउनलोडर मिडलवेयर में यूआरएल ड्रॉप करने के लिए बदलता हूँ धन्यवाद पीटर और लियो


.zip और .pdf को डिफ़ॉल्ट रूप से स्क्रेपी द्वारा अनदेखा कर दिया जाता है

एक सामान्य नियम के रूप में आप केवल एक यूआरएल को शामिल करने के लिए नियम को कॉन्फ़िगर कर सकते हैं जो आपके regexp (इस मामले में .htm *) से मेल खाते हैं:

rules = (Rule(SgmlLinkExtractor(allow=('\.htm')), callback='parse_page', follow=True, ), )

या regexp से मेल खाने वाले को बाहर निकाल दें:

rules = (Rule(SgmlLinkExtractor(allow=('.*'), deny=('\.pdf', '\.zip')), callback='parse_page', follow=True, ), )

अधिक जानकारी के लिए दस्तावेज़ीकरण पढ़ें।


यदि आप स्कैपी रूट निर्देशिका के भीतर linkextractor.py पर जाते हैं, तो आप निम्न देखेंगे:

"""
Common code and definitions used by Link extractors (located in
scrapy.contrib.linkextractor).
"""

# common file extensions that are not followed if they occur in links
IGNORED_EXTENSIONS = [
    # images
    'mng', 'pct', 'bmp', 'gif', 'jpg', 'jpeg', 'png', 'pst', 'psp', 'tif',
    'tiff', 'ai', 'drw', 'dxf', 'eps', 'ps', 'svg',

    # audio
    'mp3', 'wma', 'ogg', 'wav', 'ra', 'aac', 'mid', 'au', 'aiff',

    # video
    '3gp', 'asf', 'asx', 'avi', 'mov', 'mp4', 'mpg', 'qt', 'rm', 'swf', 'wmv',
    'm4a',

    # other
    'css', 'pdf', 'doc', 'exe', 'bin', 'rss', 'zip', 'rar',
]

हालांकि, चूंकि यह लिंक एक्सट्रैक्टर (और आप नियमों का उपयोग नहीं करना चाहते हैं) पर लागू होता है, मुझे यकीन नहीं है कि यह आपकी समस्या का समाधान करेगा (मुझे एहसास हुआ कि आपने निर्दिष्ट किया था कि आप नियमों का उपयोग नहीं करना चाहते थे। मुझे लगा आपने किसी नियम में सीधे निर्दिष्ट करने के लिए बिना फ़ाइल-एक्सटेंशन प्रतिबंधों को बदलने के लिए कहा गया है)।

अच्छी खबर यह है कि आप अपने स्वयं के डाउनलोडर मिडलवेयर का निर्माण कर सकते हैं और यूआरएल के लिए किसी भी / सभी अनुरोधों को छोड़ सकते हैं, जो अवांछनीय विस्तार है। डाउनलोडर मिडलरवेयर देखें

आप request ऑब्जेक्ट के यूआरएल विशेषता को निम्नानुसार अनुरोधित यूआरएल प्राप्त कर सकते हैं: request.url

असल में, '.exe' के लिए स्ट्रिंग के अंत में खोजें या आप जो भी एक्सटेंशन को छोड़ना चाहते हैं, और यदि इसमें कहा गया है कि अंश, एक IgnoreRequest अपवाद वापस आते हैं, और अनुरोध तुरंत हटा दिया जाएगा।

अद्यतन करें

यह डाउनलोड करने से पहले अनुरोध पर कार्रवाई करने के लिए, आपको यह सुनिश्चित करना होगा कि आप अपने कस्टम डाउनलोडर मिडलवेयर के भीतर 'process_request' विधि को परिभाषित करें।

स्क्रैपी दस्तावेज़ीकरण के अनुसार

process_request

इस विधि को प्रत्येक अनुरोध के लिए बुलाया जाता है जो डाउनलोड मिडलवेयर के माध्यम से चला जाता है।

process_request () को या तो कोई नहीं, एक प्रतिक्रिया वस्तु, या एक अनुरोध ऑब्जेक्ट वापस करना चाहिए।

यदि यह कोई भी रिटर्न नहीं देता है, तो स्क्रेपी इस अनुरोध को जारी रखेगा, अन्य सभी मध्यवर्ती क्रियान्वयन तक, अंत में, उपयुक्त डाउनलोडर हैंडलर को अनुरोध किया गया अनुरोध (और इसकी प्रतिक्रिया डाउनलोड की गई)।

अगर यह रिस्पांस ऑब्जेक्ट देता है, तो स्कार्पे किसी भी अन्य अनुरोध या अपवाद मिडलवेयर या उचित डाउनलोड फ़ंक्शन को कॉल करने में परेशान नहीं करेगा; यह उस प्रतिक्रिया को वापस लौटाएगा रिस्पांस मिडलवेयर को हमेशा हर रिस्पांस पर कहा जाता है।

अगर यह एक अनुरोध ऑब्जेक्ट देता है, तो लौटे अनुरोध को शेड्यूलर (शेड्यूलर में) में भविष्य में डाउनलोड किया जाएगा। मूल अनुरोध के कॉलबैक को हमेशा कहा जाएगा। यदि नए अनुरोध में एक कॉलबैक है, तो इसे डाउनलोड की गई प्रतिक्रिया के साथ बुलाया जाएगा, और उस कॉलबैक का आउटपुट तब मूल कॉलबैक को भेज दिया जाएगा। यदि नया अनुरोध में कॉलबैक नहीं है, तो डाउनलोड की गई प्रतिक्रिया को केवल मूल अनुरोध कॉलबैक के पास भेजा जाएगा।

यदि यह एक अनदेखी की शर्त अपवाद देता है, तो पूरे अनुरोध पूरी तरह से हटा दिया जाएगा और इसके कॉलबैक कभी नहीं बुलाएंगे।

इसलिए अनिवार्य रूप से, बस एक डाउनलोडर क्लास बनाएं, एक विधि वर्ग process_request जोड़ें, जो पैरामीटर के रूप में एक अनुरोध ऑब्जेक्ट और स्पाइडर ऑब्जेक्ट लेता है फिर यूआरएल में अवांछित एक्सटेंशन होते हैं, तो अनदेखा कर क्रम अपवाद वापस लौटाएं

यह सभी डाउनलोड किए जाने वाले पेज से पहले होने चाहिए। हालांकि, अगर आप इसके बजाय प्रतिक्रिया शीर्षकों पर कार्रवाई करना चाहते हैं, तो वेबपेज के लिए अनुरोध किए जाने की आवश्यकता नहीं है।

आप हमेशा डाउनलोडर में एक process_request और process_response विधि दोनों को कार्यान्वित कर सकते हैं, इस विचार के साथ कि स्पष्ट एक्सटेंशन तुरंत गिरा दिए जाएंगे, और अगर किसी कारण से यूआरएल में फ़ाइल एक्सटेंशन शामिल न हो, तो अनुरोध प्रोसेस हो जाएगा process_request विधि (क्योंकि आप हेडर में सत्यापित कर सकते हैं)?