Передача списка 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 скрапируется