【问题标题】:raise IgnoreRequest not working correctly in CustomDownloaderMiddleWare引发 IgnoreRequest 在 CustomDownloaderMiddleWare 中无法正常工作
【发布时间】:2020-03-26 23:24:47
【问题描述】:

我已经编写了自己的scrapy下载中间件来简单地检查db是否存在request.url,如果存在则引发IgnoreRequestf

def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called

        sql = """SELECT url FROM domain_sold WHERE url = %s;"""

        try:

            cursor = spider.db_connection.cursor()
            cursor.execute(sql, (request.url,)) 

            is_seen = cursor.fetchone()
            cursor.close()
            if is_seen:
                raise IgnoreRequest('duplicate url {}'.format(request.url))

        except (Exception, psycopg2.DatabaseError) as error:
            self.logger.error(error)

        return None

如果引发 IgnoreRequest,我希望蜘蛛会继续处理另一个请求,但在我的情况下,蜘蛛仍会继续抓取该请求并通过我的自定义管道通过项目管道。

我目前的 dl mw 设置如下

'DOWNLOADER_MIDDLEWARES':{ 'realestate.middlewares.RealestateDownloaderMiddleware': 99

任何人都可以建议为什么会发生这种情况。谢谢

【问题讨论】:

    标签: scrapy scrapy-middleware


    【解决方案1】:

    IgnoreRequest 继承自 Exception 基类,然后您会立即在 except 中捕获并记录,因此它永远不会传播到足以实际忽略请求的程度...

    变化:

    except (Exception, psycopg2.DatabaseError) as error:
    

    收件人:

    except psycopg2.DatabaseError as error:
    

    【讨论】:

    • 这是正确的,但更简洁的答案是删除 try/except,因为 process_request 应该:返回 None、返回 Response 对象、返回 Request 对象或引发 IgnoreRequest。 (即无需捕获错误)
    • @wishmaster 这意味着任何数据库异常都会变得松散并且不会被显式记录...看起来上面将始终返回 None 或引发 IgnoreRequest...(失败任何其他可能发生的异常...)例如:看起来 OP 想要记录数据库异常,而不是让它们传播,但在他们的 except 子句中使用相当广泛的 Exception 有点过分热心
    • @JonClements 谢谢。您的解决方案解决了我遇到的问题
    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2016-12-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多