spider library docs crawler python scrapy scrapyd horizontal-scaling

python - library - scrapy ruby



Escalar horizontalmente Scrapyd (1)

Ordené mi propio equilibrador de carga para Scrapyd utilizando su API y un contenedor .

from random import shuffle from scrapyd_api.wrapper import ScrapydAPI class JobLoadBalancer(object): @classmethod def get_less_occupied( cls, servers_urls=settings.SERVERS_URLS, project=settings.DEFAULT_PROJECT, acceptable=settings.ACCEPTABLE_PENDING): free_runner = {''num_jobs'': 9999, ''client'': None} # shuffle servers optimization shuffle(servers_urls) for url in servers_urls: scrapyd = ScrapydAPI(target=url) jobs = scrapyd.list_jobs(project) num_jobs = len(jobs[''pending'']) if free_runner[''num_jobs''] > num_jobs: free_runner[''num_jobs''] = num_jobs free_runner[''client''] = scrapyd # Optimization: if found acceptable pending operations in one server stop looking for another one if free_runner[''client''] and free_runner[''num_jobs''] <= acceptable: break return free_runner[''client'']

Prueba de unidad:

def setUp(self): super(TestFactory, self).setUp() # Make sure this servers are running settings.SERVERS_URLS = [ ''http://localhost:6800'', ''http://localhost:6900'' ] self.project = ''dummy'' self.spider = ''dummy_spider'' self.acceptable = 0 def test_get_less_occupied(self): # add new dummy jobs to first server so that choose the second one scrapyd = ScrapydAPI(target=settings.SERVERS_URLS[0]) scrapyd.schedule(project=self.project, spider=self.spider) scrapyd.schedule(project=self.project, spider=self.spider) second_server_url = settings.SERVERS_URLS[1] scrapyd = JobLoadBalancer.get_less_occupied( servers_urls=settings.SERVERS_URLS, project=self.project, acceptable=self.acceptable) self.assertEqual(scrapyd.target, second_server_url)

Este código se dirige a una versión anterior de scrapyd tal como fue escrita hace más de un año.

¿Qué herramienta o conjunto de herramientas usaría para escalar horizontalmente scrapyd agregando nuevas máquinas a un clúster scrapyd dinámicamente y teniendo N instancias por máquina si es necesario? No es necesario que todas las instancias compartan una cola de trabajos común, pero sería increíble.

Scrapy-cluster parece prometedor para el trabajo, pero quiero una solución basada en Scrapyd, así que escucho otras alternativas y sugerencias.