मुझे एक आइटम पाइपलाइन लोड करने के लिए अपना स्क्रैपर प्राप्त करने में समस्याएं आ रही हैं। अपने कस्टम पाइपलाइन को जोड़ने और जोड़ने के अपने प्रयासों में मुझे निम्न त्रुटि मिल रही है:

ImportError: No module named pipelines

मैंने प्रलेखन की कोशिश की है लेकिन यह वास्तव में यह नहीं बताता है कि ITEM_PIPELINE विकल्प पथ कैसे सेट करें। यह डॉक्स से उदाहरण है:

ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}

myproject कहां से आता है?

नीचे मेरे आवेदन की निर्देशिका संरचना है:

├── README.md
├── bot.py
├── data
│   └── formax.json
├── pipelines
│   ├── FormaxPipeline.py
│   └── __init__.py
├── praw.ini
├── requirements.txt
└── scrapers
    ├── __init__.py
    ├── formax.py

formax.py कक्षा में मैंने कुछ सेटिंग्स सेट की हैं।

custom_settings = {
    'ITEM_PIPELINES': {
        'pipelines.FormaxPipeline': 100
    },
    'USER_AGENT': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
}

मैं रूट डायरेक्टरी से इस तरह दौड़ता हूं:

scrapy runspider scrapers/formax.py -o data/formax.json

स्क्रैपर निम्न त्रुटि के साथ विफल रहता है:

ImportError: No module named pipelines

मैं सेटिंग्स में कस्टम पाइपलाइन कैसे जोड़ सकता हूं?

1
BugHunterUK 26 जुलाई 2017, 01:27

2 जवाब

सबसे बढ़िया उत्तर

एक दो बातें हैं। सबसे पहले, स्क्रेपी यहां यह अपेक्षा करता है कि आपके पास मानक स्क्रेपी प्रोजेक्ट संरचना है जहां myproject आपके प्रोजेक्ट का नाम है (और उस प्रोजेक्ट के फ़ोल्डर का नाम)।

दूसरा, ITEM_PIPELINES आपको अपनी पाइपलाइनों की कक्षाएं निर्दिष्ट करने की आवश्यकता है, जो मैं देख सकता हूं (आपके आवेदन की संरचना और आपके custom_settings) से आपने केवल मॉड्यूल निर्दिष्ट किया है। pipelines.FormaxPipeline के बजाय आपके पास ITEM_PIPELINES सेटिंग में pipelines.FormaxPipeline.FormaxPipeline होना चाहिए। (यहां मुझे लगता है कि आपकी कक्षा का नाम FormaxPipeline है और इसे FormaxPipeline.py फ़ाइल में परिभाषित किया गया है।)

लेकिन वास्तविक त्रुटि इस तथ्य से आती है कि स्क्रेपी मॉड्यूल का पता नहीं लगा सकता है। यह नहीं पता कि इसे और अधिक सफाई से कैसे हल किया जाए, क्योंकि आप पहले से ही कुछ ऐसा करते हैं जो स्क्रेपी को उम्मीद नहीं है (परियोजना संरचना नहीं है), लेकिन मकड़ी को इस तरह से चलाने के लिए एक समाधान है:

PYTHONPATH="$PYTHONPATH:." scrapy runspider scrapers/formax.py -o data/formax.json

यानी पायथन को यह बताने के लिए कि आपका कोड कहां देखना है।

3
Tomáš Linhart 26 जुलाई 2017, 08:40

पुराना सवाल, लेकिन मुझे ठीक वैसी ही समस्या थी और यह मुझे घंटों तक मार रहा था! मेरे पास मेरे स्पाइडर क्लास में कस्टम_सेटिंग्स वैरिएबल सेट था और मेरे पास पाइपलाइन क्लास में पाइपलाइन क्लास परिभाषित थी। फ़ाइल जो कुछ फ़ोल्डर्स ऊपर थी। फिर, आप की तरह, मैंने कुछ इस तरह से किया: "myprojname.pipelines.CsvPipeline" और उस पर विविधताएं। हर बार मुझे मॉड्यूल त्रुटि मिली।

तब मुझे कुछ समझ में आया। दस्तावेज़ीकरण में, वे शायद यह मान रहे हैं कि आप इसे सेटिंग.py फ़ाइल में सेट कर रहे हैं, न कि स्पाइडर क्लास के अंदर custom_settings चर में (मुझे लगता है कि आपने यहां सेटिंग फ़ाइल शामिल नहीं की है, लेकिन यह स्क्रैपी के साथ आता है) स्टार्टप्रोजेक्ट कमांड, मुझे यकीन है)। इसलिए, इसके बजाय मैंने उसी फ़ोल्डर में पाइपलाइन्स.py नाम की एक फ़ाइल बनाई, जिसमें मेरी स्पाइडर फ़ाइल थी। और फिर मैंने बस "पाइपलाइन्स.सीएसवीपाइपलाइन" किया और यह काम कर गया!

इसलिए, मैंने इसे सामान्य सेटिंग्स में सेट करने का भी प्रयास किया। यहाँ मुझे अपनी मकड़ी चलाते समय कोई शिकायत नहीं मिली, लेकिन ऐसा भी लग रहा था कि इसने इसका उपयोग नहीं किया। तो यह मेरे लिए कोई विकल्प नहीं था।

0
pydrink 5 मई 2020, 23:06