Вопрос по python – Пользовательская команда управления Django под управлением Scrapy: как включить опции Scrapy?

9

Я хочу быть в состоянии запуститьScrapy Web Framework изнутри Джанго. Сама Scrapy предоставляет только инструмент командной строкиscrapy для выполнения своих команд, то есть инструмент не был специально написан для вызова из внешней программы.

ПользовательМихаил Коробов придумалихорошее решениеа именно для вызова Scrapy из пользовательской команды управления 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 Теперь я могу сделатьpython manage.py scrapy crawl domain.com из проекта Django. Однако параметры команды Scrapy вообще не анализируются. Если я сделаюpython manage.py scrapy crawl domain.com -o scraped_data.json -t jsonЯ только получаю следующий ответ:

Usage: manage.py scrapy [options] 

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

So my question is, how to extend the custom management command to adopt Scrapy's command line options?

К сожалению, Djangoдокументация этой части не очень обширный. Я также прочитал документацию Pythonмодуль optparse но потом мне стало не понятнее. Может ли кто-нибудь помочь мне в этом отношении? Заранее большое спасибо!

Error: User Rate Limit Exceeded Nabin

Ваш Ответ

2   ответа
3

Guideline 10:

The argument -- should be accepted as a delimiter indicating the end of options. Any following arguments should be treated as operands, even if they begin with the '-' character. The -- argument should not be used as an option or as an operand.

optparse

# <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

Tested with scrapy 0.12 and django 1.3.1

5

manage.pymanage.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)

# -*- 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:])

Похожие вопросы