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

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

Итак, вот один паук, который хорошо работает при выполнении одной работы по очистке некоторых данных после formrequest:

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

Вместо того, чтобы преднамеренно выписывать formdata с входами формы, которые я хотел, т.е. "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()).

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

Ответ 1

да, есть отличный компаньон для scrapy под названием scrapyd, который делает именно то, что вы ищете, среди многих других лакомств, вы можете также запускайте пауков через него, например:

$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2
{"status": "ok", "jobid": "26d1b1a6d6f111e0be5c001e648c57f8"}

вы также можете добавить свои пользовательские параметры, используя -d param=123

btw, пауки scheduled, а не launched вызывают скрапый управление очередью с (настраиваемым) максимальным количеством работающих пауков параллельно

Ответ 2

Здесь это простой способ. вам нужно сохранить этот код в том же каталоге с помощью scrapy.cfg(Моя версия для сканирования - 1.3.3):

from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

setting = get_project_settings()
process = CrawlerProcess(setting)

for spider_name in process.spiders.list():
    print ("Running spider %s" % (spider_name))
    process.crawl(spider_name,query="dvh") #query dvh is custom argument used in your scrapy

process.start()

и запустите его. вот оно!

Ответ 3

Ваш метод делает его процедурным, что делает его медленным, против главного директора Scrapy. Чтобы сделать его асинхронным, как всегда, вы можете попробовать использовать CrawlerProcess

from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

from myproject.spiders import spider1, spider2

1Spider = spider1.1Spider()
2Spider = spider2.2Spider()
process = CrawlerProcess(get_project_settings())
process.crawl(1Spider)
process.crawl(2Spider)
process.start()

Если вы хотите просмотреть полный журнал обхода, установите LOG_FILE в settings.py.

LOG_FILE = "logs/mylog.log"