Ejecutando múltiples arañas de Scrapy (la forma fácil) Python

Scrapy es bastante bueno, sin embargo, encontré la documentación a grandes rasgos, y algunas preguntas simples fueron difíciles de responder. Después de juntar varias técnicas de varios flujos de apilamiento, finalmente se me ocurrió una forma fácil y no demasiado técnica de ejecutar múltiples arañas desechables. Me imagino que es menos técnico que intentar implementar scrapyd, etc.:

Así que aquí hay una araña que trabaja bien para hacer un trabajo de raspar algunos datos después de una solicitud de formulario:

from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from scrapy.http import Request
from scrapy.http import FormRequest
from swim.items import SwimItem

class MySpider(BaseSpider):
    name = "swimspider"
    start_urls = ["swimming website"]

    def parse(self, response):
        return [FormRequest.from_response(response,formname="AForm",
                    formdata={"lowage": "20, "highage": "25"}
                    ,callback=self.parse1,dont_click=True)]

    def parse1(self, response):       
        #open_in_browser(response)
        hxs = Selector(response)
        rows = hxs.xpath(".//tr")
        items = []

        for rows in rows[4:54]:
            item = SwimItem()
            item["names"] = rows.xpath(".//td[2]/text()").extract()
            item["age"] = rows.xpath(".//td[3]/text()").extract()
            item["swimtime"] = rows.xpath(".//td[4]/text()").extract()
            item["team"] = rows.xpath(".//td[6]/text()").extract()
            items.append(item)           
        return items

En lugar de escribir deliberadamente los formdata con las entradas del formulario que quería, es decir, "20" y "25:

formdata={"lowage": "20", "highage": "25}

Utilicé "yo". + un nombre de variable:

formdata={"lowage": self.lowage, "highage": self.highage}

Esto le permite llamar a la araña desde la línea de comandos con los argumentos que desee (ver más abajo). Utilice la función call () de subproceso de python para llamar a esas mismas líneas de comando una tras otra, fácilmente. Significa que puedo ir a mi línea de comandos, escribir "python scrapymanager.py" y hacer que todas mis arañas hagan su trabajo, cada una con diferentes argumentos pasados ​​en su línea de comandos, y descargar sus datos en el lugar correcto:

#scrapymanager

from random import randint
from time import sleep
from subprocess import call

#free
call(["scrapy crawl swimspider -a lowage='20' -a highage='25' -a sex='W' -a StrkDist='10025' -o free.json -t json"], shell=True)
sleep(randint(15,45))

#breast
call(["scrapy crawl swimspider -a lowage='20' -a highage='25' -a sex='W' -a StrkDist='30025' -o breast.json -t json"], shell=True)
sleep(randint(15,45))

#back
call(["scrapy crawl swimspider -a lowage='20' -a highage='25' -a sex='W' -a StrkDist='20025' -o back.json -t json"], shell=True)
sleep(randint(15,45))

#fly
call(["scrapy crawl swimspider -a lowage='20' -a highage='25' -a sex='W' -a StrkDist='40025' -o fly.json -t json"], shell=True)
sleep(randint(15,45))

Así que, en lugar de pasar horas tratando de armar una araña individual complicada que rastrea cada forma en sucesión (en mi caso, diferentes golpes de natación), esta es una manera bastante indolora de correr muchas arañas "todas a la vez" (incluí un retraso entre cada llamada desechable con las funciones sleep ().

Esperemos que esto ayude a alguien.

Respuestas a la pregunta(3)

Su respuesta a la pregunta