【问题标题】:Python Scheduler - "Process finished" after first job, wont run following jobsPython Scheduler - 第一份工作后“处理完成”,不会运行以下工作
【发布时间】:2018-08-25 06:25:59
【问题描述】:

我使用 Python 和 Scrapy (https://scrapy.org/) 实现了一个网络爬虫。

需要依次运行三个不同的进程。第一个将配置文件键写入 MongoDB 集合,第二个爬取给定配置文件的所有子域并将它们写入另一个集合,第三个将特定配置文件数据写入 SQL 数据库。

现在我想自动运行这些进程。我查看了模块 Schedule (https://github.com/dbader/schedule, https://schedule.readthedocs.io/en/stable/index.html) 并编写了以下代码:

import schedule
import time
from scrapy import cmdline
from scrapers.scrapy_new_users.helpers.dataAggregator import DataAggregator


def run_key_fetcher():
    print("Running key_fetcher")
    command = "scrapy crawl fetch_profile_keys ".split()
    cmdline.execute(command)


def run_profile_scraper():
    print("Running profile_scraper")
    command = ("scrapy crawl fetch_profiles "
               "-a login_user=user"
               "-a login_password=password").split()
    cmdline.execute(command)


def run_data_aggregator():
    print("Running data_aggregator")
    data_aggregator = DataAggregator()
    data_aggregator.parse()


schedule.every().day.at("1:00").do(run_key_fetcher)
schedule.every().day.at("2:00").do(run_profile_scraper)
schedule.every().day.at("12:00").do(run_data_aggregator)

while True:
    schedule.run_pending()
    time.sleep(1)

运行此代码时,第一个作业在给定时间开始,我得到一个Process finished with exit code 0。之后调度程序停止,其他作业不运行。

我怀疑这是“进程完成”的正常行为,但有什么办法可以解决吗? 还是我应该使用一些不同的调度模块?

我没有通过 scrapyd 部署蜘蛛,因为我的第三个进程不是蜘蛛。

提前谢谢你!

【问题讨论】:

    标签: python scrapy scheduled-tasks scheduler scrapy-spider


    【解决方案1】:

    我建议你阅读 Scrapy 文档的这一部分:

    https://doc.scrapy.org/en/latest/topics/practices.html

    特别是它所说的部分:通过链接延迟来顺序运行蜘蛛。

    您可以将蜘蛛程序和数据导出脚本链接到一个运行程序脚本中。比使用 python 调度程序模块定期调用该脚本。

    from twisted.internet import reactor, defer
    from scrapy.crawler import CrawlerRunner
    from scrapy.utils.log import configure_logging
    from scrapers.scrapy_new_users.helpers.dataAggregator import DataAggregator
    
    class MySpider1(scrapy.Spider):
        # Your first spider definition
        ...
    
    class MySpider2(scrapy.Spider):
        # Your second spider definition
        ...
    
    configure_logging()
    runner = CrawlerRunner()
    
    @defer.inlineCallbacks
    def crawl():
        yield runner.crawl(MySpider1)
        yield runner.crawl(MySpider2)
        reactor.stop()
    
    crawl()
    reactor.run()
    data_aggregator = DataAggregator()
    data_aggregator.parse()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2017-07-06
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多