如何处理蜘蛛中引发的蜘蛛外的异常

时间:2019-06-14 16:24:58

标签: python api exception flask scrapy

我目前正在使用Scrapy开发REST API,我想捕获控制器级别的异常并将相应的HTTP状态代码返回给客户端。以下示例代码显示了如何引发异常:

class MySpider(Spider):
    name = 'my_spider'
    allowed_domains = ['www.xxxxx.com']

    def __init__(self, **kw):
        super(MySpider, self).__init__(**kw)
        self.base_url = kw['url']
        self.action = kw['action']
        self.mongo = pymongo.MongoClient(kw['conn'])

    def start_requests(self):
        if XXX1:
            raise XXX1Error('message')
        yield Request(self.base_url)

    def parse(self, response):
        if XXX2:
            raise XXX2Error('message')
        # Some custom codes

这些是控制器中的示例代码(我必须在这里使用子过程,因为反应器无法重新启动):

@app.route('/xxxx/xxxx/xxxx', methods=['POST'])
def endpoint_entry():
    link_json = request.get_json('link')
    link = link_json.get('link')

    # Initiate a sub-process for the crawling
    process = subprocess.Popen(['scrapy', 'crawl', '{0}'.format('my_spider'),
            '-a', 'url={0}'.format(link),
            '-a', 'action={0}'.format('download'),
            '-a', 'conn={0}'.format(MONGO_CONNECTION_STRING)])
    process.wait()

    if process.returncode != 0:
        return 'Something was not right', 400
    return 'Scrapping has been processed', 200

但是,看起来子流程中引发的异常不会导致子流程的返回码为1,我什至尝试直接调用sys.exit(1)而不是raise XXXError('message') ,并且返回代码仍为0,我还尝试使用spider_error信号来捕获引发的异常,并引发新异常或退出该处的子流程,但它也无法正常工作。所以我真的很想知道是否有任何办法可以解决这个问题?还是根本没有适当的解决方案?我会很感激任何答案!

0 个答案:

没有答案