2016-07-28 65 views
1

我正在使用InitSpider并在def __init__(self, *a, **kw):方法中读取自定义json配置。Scrapy:根据从自定义配置中读取的值覆盖DEPTH_LIMIT变量

该json配置文件包含一个指令,我可以控制爬行深度。我已经可以成功读取该配置文件并提取该值。主要问题是如何告诉scrapy使用这个值。

注意:我不想使用命令行参数,如-s DEPTH_LIMIT=3,我真的想从我的自定义配置中解析它。

回答

1

DEPTH_LIMIT用于scrapy.spidermiddlewares.depth.DepthMiddleware。正如您可能已经快速查看了代码,您会看到DEPTH_LIMIT值仅在初始化该中间件时才被读取。

我觉得这可能是一个很好的解决你:

  1. 在你的蜘蛛__init__方法,设置一个蜘蛛属性max_depth与您的自定义值。
  2. 覆盖scrapy.spidermiddlewares.depth.DepthMiddleware并让它检查max_depth属性。
  3. 禁用默认DepthMiddleware并在设置中启用您自己的一个。

参见http://doc.scrapy.org/en/latest/topics/spider-middleware.html

在第2步中描述的重写中间件的一个简单的例子:

class MyDepthMiddleware(DepthMiddleware): 

    def process_spider_output(self, response, result, spider): 
    if hasattr(spider, 'max_depth'): 
     self.maxdepth = getattr(spider, 'max_depth') 
    return super(MyDepthMiddleware, self).process_spider_output(response, result, spider) 
+0

我在哪里保存中间件类,我应该给什么名呢? – cytopia

+0

我解决了上述问题。它现在可以工作,但似乎深度> max_depth的页面仍然被抓取(下载),但没有处理。为了节省时间和带宽,是否也可以不首先下载它们? – cytopia