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

发布于 2022-09-11 19:17:01 字数 1426 浏览 22 评论 0

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 都不会报错...
这怎么搞?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧故 2022-09-18 19:17:01

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文