在while循环中运行同一蜘蛛

时间:2019-07-02 13:44:50

标签: python loops while-loop scrapy web-crawler

我有一个python脚本,可以检查特定的文件夹中是否有更改。更确切地说,我正在等待包含小时的新JSON文件。如果出现此JSON文件,则会调用一个函数来使用计划库计划任务。

创建的任务在计划的时间运行蜘蛛。 问题出在我的JSON文件中有多个小时。多次调用同一蜘蛛(与JSON文件中的行一样多),并且该程序引发ReactorNotRestartable错误。从schedule.run_pending行调用蜘蛛。

我非常确定问题出自同一蜘蛛的多次调用,因为该程序已完成抓取的第一步(使用第一个URL的第一个小时),但对第二个则无效。

我不知道该如何处理这个反应堆问题,您能给我一些建议吗?

监视程序模块以监视存储库

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 :(得分:0)

不幸的是,我没有找到办法。我用beautifulSoup编写了一个代码,它可以让我多次执行同一段代码。