spider中间件中的异步数据库请求?

2024-10-05 12:21:59 发布

您现在位置:Python中文网/ 问答频道 /正文

序言:

我有一个蜘蛛,它把结果存储在数据库中。然后,为了节省一些时间和远程web服务器资源,我决定不请求数据库中已经存在的项。在阅读文档时,我认为定制spider中间件是我最好的选择。在

class SkipDupeMiddleware(object):
    process_spider_output(response, result, spider):
        for r in result:
            if isinstance(r, Request) and item_in_database(r.url):
                log.msg('Skip %s' % r.url)
            else:
                yield r

{cddb>查询。在

它的效果也很好,节省了很多时间。在

现在真正的问题是:

后来我读到在非阻塞应用中使用阻塞数据库请求不是一个好主意。我一直在做正确的事情,并决定将我所有的db请求打包到adbapi

我已经找到了在管道中使用adbapi的方法,但是在中间件级别是否可以这样做呢?中间件应该返回BaseItemRequest或{},但是adbapi返回{}的{},后者稍后返回Request或{}。在

现在我被卡住了。在


Tags: 中间件inweb数据库url远程request时间
3条回答

阿法伊克

瘙痒大多是同步的。只有页面的下载是异步完成的,这就是请求有回调的原因。在

管道和中间件是同步的。在

您可以(并且应该)从管道process_item()方法返回延迟的。在

默认情况下,scrapy不会在爬网中通过使用重复过滤器(默认情况下启用)发出duplicaterequest。设置参数DUPEFILTER_CLAS决定使用哪个过滤器 它的默认值是:'刮花.dupefilter.RFPDupeFilter'. 事实上,它只是 现在就选择。 如果你想要一个持久的特性,你应该设置一个JOBDIR。然后,scrapy将存储访问的URL,并在下一次运行时将其加载到过滤器的dict中。在

你可以在这里得到一些提示: http://groups.google.com/group/scrapy-users/browse_thread/thread/56546e9fab7030f3

相关问题 更多 >

    热门问题