Запустите тот же паук в цикле - PullRequest
0 голосов
/ 02 июля 2019

У меня есть скрипт на python, который проверяет в определенной папке, есть ли изменения. Если быть более точным, я жду новый файл JSON, содержащий часы. Если появляется этот файл JSON, вызывается функция для планирования задачи с помощью библиотеки расписаний.

Созданная задача запускает паука в назначенный час. Проблема заключается в том, что в моем файле JSON несколько часов Один и тот же паук вызывается несколько раз (столько раз, сколько у нас строк в файле JSON), и программа вызывает ошибку ReactorNotRestartable. Паук вызывается из строки schedule.run_pending.

Я почти уверен, что проблема связана с несколькими вызовами одного и того же паука, потому что программа выполняет первый этап очистки (первый час с первым URL), но не работает для второго.

Я не знаю, как я могу решить эту проблему с реактором, можете ли вы дать мне какие-то комментарии?

Модуль Watchdogs для мониторинга хранилища

try:
    #get json hours
    hours = get_all_starting_hours('../data/output/result_debut.json')
    logger.info(hours)
    #get json urls
    urls = get_all_urls('../data/output/result_debut.json')
    logger.info(urls)
    for hour, url in zip(hours, urls):
        #schedule pour chaque url la tâche pour l'heure donnée
        logger.info(hour)
        logger.info(url)
        # schedule scraping task                    
        schedule.every().day.at(str(hour)).do(job_that_executes_once, url, process_settings=None)
    while True:
        logger.info('dans le while')
        #run scheduled task
        schedule.run_pending()
        time.sleep(1)
except Exception as e:
     logger.debug(str(e))

Расписание

def job_that_executes_once(url, process_settings):
    logger.add("../data/logs/schedule_{time}.log")
    logger.info('job a été lancé')
    #run spider
    run_MySpider(url)
return schedule.CancelJob

Паук

class MySpider(scrapy.Spider):
name = "enchere_detail"

logger.add('../data/logs/Spider_{time}.log')

def __init__(self, **kwargs):
    super(MySpider, self).__init__(**kwargs)
    self.start_urls = [kwargs.get('url_start')]
    logger.info(self.start_urls)

def parse(self, response):
    logger.info('debut du parse')
    yield{
            'fin_vente': response.css('span.stats-heure-fin::text').get(),
            'url' : response.url
            }

def run_MySpider(url):
    process.crawl(MySpider, url_start = url)
    process.start()

Ошибка

line 754, in startRunning
    raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable

Спасибо

1 Ответ

0 голосов
/ 08 июля 2019

К сожалению, я не нашел пути с помощью скрапа.Я написал код с BeautifulSoup, он может позволить мне выполнить несколько раз один и тот же кусок кода.

...