Python 如何在气流DAG中运行状态1时退出报废
我正在尝试退出scrapy,状态代码为1,出现异常。脚本正在通过DAG运行。但任务未退出,状态代码为1Python 如何在气流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)
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=原因