Python 如何在气流DAG中运行状态1时退出报废

Python 如何在气流DAG中运行状态1时退出报废,python,scrapy,airflow,directed-acyclic-graphs,Python,Scrapy,Airflow,Directed Acyclic Graphs,我正在尝试退出scrapy,状态代码为1,出现异常。脚本正在通过DAG运行。但任务未退出,状态代码为1 try: photo = requests.get(self.img_url + '/' + inmate['ImageId']).content except Exception as e: logging.error("Error is " + str(e)) self.spider.closespider_errorcount(1)

我正在尝试退出scrapy,状态代码为1,出现异常。脚本正在通过DAG运行。但任务未退出,状态代码为1

try:
    photo = requests.get(self.img_url + '/' + inmate['ImageId']).content

except Exception as e:
       logging.error("Error is  " + str(e))
       self.spider.closespider_errorcount(1)
       raise CloseSpider(e)
       sys.exit(1)
[2019-08-21 09:34:16199]{{bash_operator.py:127}}INFO- scrapy.exceptions.CloseSpider[2019-08-21 09:34:18737] {{bash_operator.py:131}}INFO-命令已退出,返回代码为0 [2019-08-21 09:34:18852]{{base_task_runner.py:101}信息-作业 26813:子任务爬网_7001 /usr/local/lib/python3.6/site packages/psycopg2/init.py:144: 用户警告:psycopg2控制盘软件包将从发布版重命名 2.8; 为了保持从二进制文件安装,请改用“pip安装psycopg2二进制文件”。详情请参阅: . [2019-08-21 09:34:18853]{{base_task_runner.py:101}}信息-作业 26813:子任务爬网(U 7001“”)[2019-08-21 09:34:21189] {{logging_mixin.py:95}}INFO-[2019-08-2109:34:21189] {{jobs.py:2630}}警告-此实例的状态已在外部更改 准备成功。服用毒丸。[2019-08-21 09:34:21351] {{helpers.py:281}}INFO-将Signals.SIGTERM发送到GPID4765 [2019-08-21 09:34:21436]{{helpers.py:263}}信息-流程 进程(pid=4765,status='terminated')(4765)终止于 退出代码-15[2019-08-21 09:34:21437]{{logging_mixin.py:95}}INFO- [2019-08-21 09:34:21437]{{jobs.py:2562}}INFO-任务已退出 返回代码0


我也有同样的问题,这是我的解决方案:

其思想是使用
信号。spider_closed

  • quotes_spider.py
import scrapy
从scrapy.exceptions导入CloseSpider
类QuotesSpider(刮毛蜘蛛):
name=“quotes”
def start_请求(自我):
URL=[
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
对于url中的url:
生成scrapy.Request(url=url,callback=self.parse,errback=self.parse\u error)
def解析(自我,响应):
通过
def解析_错误(自身,响应):
提出建议(“我的理由”)
  • 爬网\u进程\u包装器.py
导入日志
进口羊瘙痒
从刮擦进口信号
从scrapy.crawler导入crawler进程
从scrapy.utils导入日志
从scrapy.utils.project导入获取项目设置
类ScrapyCrawlerProcessWrapper:
爬虫程序错误=无
爬虫程序_关闭=无
def uuu init uuuu(self,level u level:str='INFO'):
self.crawler\u错误=无
self.process=CrawlerProcess(获取项目设置(),False)
log.dictConfig({
“版本”:1,
“禁用现有日志记录器”:True,
“伐木工人”:{
“刮痧”:{
“级别”:级别,
}
}
})
def add_spider(self,spider:scrapy.spider,**know_args):
logging.debug('add_spider:%s',spider)
self.process.crawl(爬行器,**知道参数)
def start_爬网(自):
对于self.process.crawler中的爬虫程序:
爬虫.信号.连接(接收器=self.spider\u错误,信号=信号.spider\u错误)
爬虫。信号。连接(接收器=self.spider\u关闭,信号=signals.spider\u关闭)
#阻止进程,直到所有爬网程序完成
self.process.start()文件
#检查例外情况
如果self.crawler\u错误:
self.crawler_error.raiseException()
#检查例外情况
如果self.crawler\u关闭:
logging.error('爬网程序已关闭,因为:%s'%self.crawler\u已关闭)
出口(1)
def spider_错误(自身、*args、**kwargs):
如果kwargs中出现“故障”:
打印(kwargs[“失败])
self.crawler_error=kwargs['failure']
def卡盘_关闭(自身、卡盘、原因):
如果原因!=“已完成”:
self.crawler\u closed=原因