2016-07-28 66 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