序言:
我有一个蜘蛛,它把结果存储在数据库中。然后,为了节省一些时间和远程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
的方法,但是在中间件级别是否可以这样做呢?中间件应该返回BaseItem
、Request
或{adbapi
返回{Request
或{
现在我被卡住了。在
阿法伊克
瘙痒大多是同步的。只有页面的下载是异步完成的,这就是请求有回调的原因。在
管道和中间件是同步的。在
您可以(并且应该)从管道
process_item()
方法返回延迟的。在默认情况下,scrapy不会在爬网中通过使用重复过滤器(默认情况下启用)发出duplicaterequest。设置参数DUPEFILTER_CLAS决定使用哪个过滤器 它的默认值是:'刮花.dupefilter.RFPDupeFilter'. 事实上,它只是 现在就选择。 如果你想要一个持久的特性,你应该设置一个JOBDIR。然后,scrapy将存储访问的URL,并在下一次运行时将其加载到过滤器的dict中。在
你可以在这里得到一些提示: http://groups.google.com/group/scrapy-users/browse_thread/thread/56546e9fab7030f3
相关问题 更多 >
编程相关推荐