Scrapy+twisted 异步MySQL批量提交不报错

Scrapy+twisted 异步MySQL批量提交不报错

在正常情况下,默认1000个item执行一次插入,如果爬虫爬取结束,就将剩下的都插入
每1000个的插入如果出错,会报出来(跳到处理函数)

def process_item(self, item, spider):
    if type(item) not in self.item_list.keys():
        self.item_list[type(item)] = {"sql": item.get_insert_sql(), "items": []}
    self.item_list[type(item)]["items"].append(item.get_insert_param())
    if len(self.item_list[type(item)]["items"]) >= self.mysql_item_list_limit:
        self.do_insert(deepcopy(self.item_list[type(item)]))
        self.item_list[type(item)]["items"].clear()
    return item
    
def do_insert(self, item_list, retrying=False):
    query = self.dbpool.runInteraction(self.do_sql, item_list)
    query.addCallback(self.handle_result, item_list)
    query.addErrback(self.handle_error, item_list, retrying)

def do_sql(self, cursor, item):
    cursor.executemany(item["sql"], item["items"])

def handle_result(self, result, item_list):
    self.spider.logger.info('{} items inserted with retcode {}'.format(len(item_list["items"]), result))

def handle_error(self, failure, item_list, retrying):
    self.spider.logger.error(failure, item_list)

在爬虫结束,调用pipline的close_spider函数,把剩下的插入,但是有错误不会报错

def close_spider(self, spider):
    for items in self.item_list.values():
        self.do_insert(items)

断点,一步步跟进去,驱动确实捕捉到了错误,但是没有跳到处理函数(两个都没有执行),
实际上在这里写个 1/0 都不会报错...
这怎么搞?

阅读 3.3k
1 个回答

我也遇到了这个问题,还没找到解决方法。
不过发现单步调试就能捕获这个异常,直接执行就不行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题