Запуск нескольких Scrapy Spiders (простой способ) Python

Scrapy довольно круто, но я нашел документацию очень скромной, и на некоторые простые вопросы было сложно ответить. После объединения различных техник из различных стековых потоков я, наконец, нашел простой и не слишком технический способ запуска нескольких пауков-скраперов. Я хотел бы представить его менее техническим, чем пытаться реализовать scrapyd и т.д .:

Так вот один паук, который хорошо работает при этомОдна задача - очистить некоторые данные после запроса формы:

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

Вместо того, чтобы преднамеренно записывать данные формы с нужными мне формами ввода, т.е.20" а также "25:

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

Я использовал "Я «. + имя переменной:

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

Затем это позволяет вам вызвать паука из командной строки с нужными аргументами (см. Ниже). Используйте функцию вызова подпроцесса python, чтобы легко вызывать эти самые командные строки. Это означает, что я могу перейти к моей командной строке, наберите "python scrapymanager.py " и пусть все мои пауки делают свое дело, каждый с разными аргументами, передаваемыми в командной строке, и загружает свои данные в правильное место:

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

Таким образом, вместо того, чтобы тратить часы на то, чтобы собрать сложного одиночного паука, который сканирует каждую форму подряд (в моем случае разные удары плавания), это довольно безболезненный способ запустить много-много пауков ».все сразу" (Я включил задержку между каждым вызовом scrapy с функциями sleep ()).

Надеюсь, это кому-нибудь поможет.

Ответы на вопрос(3)

Ваш ответ на вопрос