Передача списка start_urls в качестве параметра из Django в Scrapyd

Я работаю в небольшой платформе для скрапинга, используя Django и Scrapy (scrapyd в качестве API). Паук по умолчанию работает как ожидалось, а используя ScrapyAPI (python-scrapyd-api) я передаю URL из Django и скрапирую данные, я даже сохраняю результаты в виде JSON в экземпляр postgres. Это для ОДНОГО URL, передаваемого в качестве параметра.

При попытке передать список URL, scrapy просто берет первый URL из списка. Я не знаю, связано ли это с тем, как Python или ScrapyAPI обрабатывает эти аргументы.

# views.py
# This is how I pass parameters from Django
task = scrapyd.schedule(
        project=scrapy_project,
        spider=scrapy_spider,
        settings=scrapy_settings,
        url=urls
    )


# default_spider.py
def __init__(self, *args, **kwargs):
        super(SpiderMercadoLibre, self).__init__(*args, **kwargs)
        self.domain = kwargs.get('domain')
        self.start_urls = [self.url] # list(kwargs.get('url'))<--Doesn't work               
        self.allowed_domains = [self.domain]

# Setup to tell Scrapy to make calls from same URLs
def start_requests(self):
...
for url in self.start_urls:             
    yield scrapy.Request(url, callback=self.parse, meta={'original_url': url}, dont_filter=True)

Конечно, я могу внести некоторые изменения в свою модель, чтобы сохранить каждый результат, итерируя список URL и планируя каждый URL с помощью ScrapydAPI, но мне интересно, является ли это ограничением самого scrapyd или я что-то упустил в механике Python.

Вот как ScrapydAPI обрабатывает метод schedule:

def schedule(self, project, spider, settings=None, **kwargs):
        """
        Schedules a spider from a specific project to run. First class, maps
        to Scrapyd's scheduling endpoint.
        """

        url = self._build_url(constants.SCHEDULE_ENDPOINT)
        data = {
            'project': project,
            'spider': spider
        }
        data.update(kwargs)
        if settings:
            setting_params = []
            for setting_name, value in iteritems(settings):
                setting_params.append('{0}={1}'.format(setting_name, value))
            data['setting'] = setting_params
        json = self.client.post(url, data=data, timeout=self.timeout)
        return json['jobid']

Я думаю, что реализовал все, как ожидалось, но каждый раз, независимо от того, какой подход используется, только первый URL из списка URL скрапируется

Вернуться на верх