2012-05-12 8 views
9

मैं Django के भीतर से Scrapy web crawling framework चलाने में सक्षम होना चाहता हूं। स्केपर ही अपने आदेशों को निष्पादित करने के लिए केवल एक कमांड लाइन उपकरण scrapy प्रदान करता है, यानी उपकरण को जानबूझकर बाहरी प्रोग्राम से बुलाया नहीं गया था।Django कस्टम प्रबंधन कमांड स्केलिंग चल रहा है: स्केपर के विकल्पों को कैसे शामिल करें?

उपयोगकर्ता Mikhail Korobovnice solution के साथ आया, अर्थात् एक Django कस्टम प्रबंधन कमांड से स्केपर को कॉल करने के लिए। सुविधा के लिए, मैं यहां अपना समाधान दोहराता हूं:

# -*- coding: utf-8 -*- 
# myapp/management/commands/scrapy.py 

from __future__ import absolute_import 
from django.core.management.base import BaseCommand 

class Command(BaseCommand): 

    def run_from_argv(self, argv): 
     self._argv = argv 
     return super(Command, self).run_from_argv(argv) 

    def handle(self, *args, **options): 
     from scrapy.cmdline import execute 
     execute(self._argv[1:]) 

उदा। scrapy crawl domain.com अब मैं Django परियोजना के भीतर से python manage.py scrapy crawl domain.com कर सकता हूं। हालांकि, एक स्केपर कमांड के विकल्प बिल्कुल पार्स नहीं किए जाते हैं।

Usage: manage.py scrapy [options] 

manage.py: error: no such option: -o 

तो मेरे सवाल, कैसे Scrapy के कमांड लाइन विकल्पों को अपनाने के लिए कस्टम प्रबंधन कमांड का विस्तार करने की है: अगर मैं python manage.py scrapy crawl domain.com -o scraped_data.json -t json करते हैं, मैं केवल निम्नलिखित प्रतिक्रिया मिल?

दुर्भाग्य से, Django के documentation of this part बहुत व्यापक नहीं है। मैंने पायथन के optparse module के दस्तावेज़ीकरण को भी पढ़ा है लेकिन बाद में यह मेरे लिए स्पष्ट नहीं था। क्या कोई इस संबंध में मेरी मदद कर सकता है? आपका अग्रिम रूप से बोहोत धन्यवाद!

+0

लेकिन क्या हमें क्रॉल करने के लिए शीर्ष निर्देशिका में नहीं होना चाहिए ?? यह कैसे किया जाता है? @pemistahl – Nabin

उत्तर

5

ठीक है, मुझे मेरी समस्या का समाधान मिला है। यह थोड़ा बदसूरत है लेकिन यह काम करता है। चूंकि Django प्रोजेक्ट के manage.py कमांड स्केपर के कमांड लाइन विकल्पों को स्वीकार नहीं करता है, इसलिए मैंने विकल्प स्ट्रिंग को दो तर्कों में विभाजित किया है जिन्हें manage.py द्वारा स्वीकार किया जाता है। सफल पार्सिंग के बाद, मैं दो तर्कों से जुड़ता हूं और उन्हें स्केपर में भेजता हूं।

यही है, बजाय लेखन

python manage.py scrapy crawl domain.com -o scraped_data.json -t json 

मैं इस

python manage.py scrapy crawl domain.com - o scraped_data.json - t json 

मेरे संभाल समारोह की तरह विकल्पों के बीच में रिक्त स्थान डाल के इस तरह दिखता है:

def handle(self, *args, **options): 
    arguments = self._argv[1:] 
    for arg in arguments: 
     if arg in ('-', '--'): 
      i = arguments.index(arg) 
      new_arg = ''.join((arguments[i], arguments[i+1])) 
      del arguments[i:i+2] 
      arguments.insert(i, new_arg) 

    from scrapy.cmdline import execute 
    execute(arguments) 

इस बीच, मिखाइल Korobov है इष्टतम समाधान प्रदान किया। यहाँ देखें:

# -*- coding: utf-8 -*- 
# myapp/management/commands/scrapy.py 

from __future__ import absolute_import 
from django.core.management.base import BaseCommand 

class Command(BaseCommand): 

    def run_from_argv(self, argv): 
     self._argv = argv 
     self.execute() 

    def handle(self, *args, **options): 
     from scrapy.cmdline import execute 
     execute(self._argv[1:]) 
3

मुझे लगता है कि तुम सच में दिशानिर्देश POSIX argument syntax conventions के 10 लिए देख रहे हैं:

तर्क - एक परिसीमक विकल्पों के अंत का संकेत के रूप में स्वीकार किया जाना चाहिए। किसी भी निम्नलिखित तर्क को ऑपरेंड के रूप में माना जाना चाहिए, भले ही वे '-' वर्ण से शुरू हों। तर्क - एक विकल्प के रूप में या एक ऑपरेंड के रूप में इस्तेमाल नहीं किया जाना चाहिए।

पायथन का optparse मॉड्यूल विंडोज़ के तहत भी इस तरह से व्यवहार करता है।

मैं तर्क सूची में scrapy परियोजना सेटिंग्स मॉड्यूल शब्दों में कहें, तो मैं स्वतंत्र क्षुधा में अलग scrapy परियोजनाओं बना सकते हैं: इस प्रकार

# <app>/management/commands/scrapy.py 
from __future__ import absolute_import 
import os 

from django.core.management.base import BaseCommand 

class Command(BaseCommand): 
    def handle(self, *args, **options): 
     os.environ['SCRAPY_SETTINGS_MODULE'] = args[0] 
     from scrapy.cmdline import execute 
     # scrapy ignores args[0], requires a mutable seq 
     execute(list(args)) 

अनुरोध किया गया:

python manage.py scrapy myapp.scrapyproj.settings crawl domain.com -- -o scraped_data.json -t json 

scrapy 0.12 के साथ परीक्षण किया गया और django 1.3.1

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