Scrapy запускает всех пауков одновременно. Я хочу запустить только одного паука за раз. Scrapy crawl <spider> - PullRequest
3 голосов
/ 26 октября 2019

Я новичок в Scrapy и пытаюсь поиграться с фреймворком. Что действительно расстраивает, так это то, что когда я запускаю «scrapy crawl (name of spider)», он запускает каждого отдельного паука в моей папке «spiders». Так что мне нужно либо подождать всех бегающих пауков, либо закомментировать всех пауков, кроме одного, с которым я работаю. Это очень раздражает. Как я могу сделать так, чтобы скрапом управлял только один паук за раз?

Ответы [ 2 ]

3 голосов
/ 26 октября 2019

Вы можете запустить scrapy из своего скрипта (https://scrapy.readthedocs.io/en/latest/topics/practices.html#run-from-script),, например:

import scrapy
from scrapy.crawler import CrawlerProcess

class YourSpider(scrapy.Spider):
    # Your spider definition


process = CrawlerProcess()
process.crawl(YourSpider)
process.start() 
0 голосов
/ 27 октября 2019

Он не должен запускать весь паук, хотя он компилирует и запускает некоторые вещи, так как именно так он вытягивает имена пауков (я предполагаю, что есть другие причины, в противном случае это кажется странным способом настроить вещи). Если вы опубликуете своего паука, мы увидим, что может работать, а не нет.

У меня возникла та же проблема, поскольку мои пауки модифицировали CSV-файлы, в том числе переименовывали / удаляли их, что приводило к ошибкам, когда я только хотелзапустить конкретного паука. Мое решение состояло в том, чтобы заставить пауков выполнять определенные задачи только тогда, когда они действительно запущены или закрыты. Документация здесь: https://docs.scrapy.org/en/latest/topics/signals.html хотя я обнаружил, что этого не хватает. Вот код, который я использовал. Раздел from_crawler может быть оставлен в стороне от изменения имени паука. Поместите все, что вы хотите в закрытой части spider_

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    spider = super(SixPMSpider, cls).from_crawler(crawler, *args, **kwargs)
    crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
    return spider

def spider_closed(self, spider):
    os.remove(self.name+'_price_list.csv')
    os.rename(self.name+'_price_list2.csv', self.name+'_price_list.csv')  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...