擅长:python、mysql、java
<p>(在写这个答案的时候,<code>scrapy</code>的最新版本是<code>1.0.3</code>。此答案适用于<code>scrapy</code>)的所有最新版本</p>
<p>由于<code>OffsiteMiddleware</code>只在处理<code>spider_opened</code>信号时初始化预编译的regex对象时才读取<code>allowed_domains</code>中的内容,<code>allowed_domains</code>中的值以后永远不会被访问。<br/>
因此,仅仅更新<code>allowed_domains</code>的内容并不能解决问题。在</p>
<p>基本上需要两个步骤:</p>
<ol>
<li>根据您的实际需要更新<code>allowed_domains</code>的内容。在</li>
<li>刷新<code>OffsiteMiddleware</code>中的regex缓存。在</li>
</ol>
<p>以下是我在步骤2中使用的代码:</p>
<pre><code># Refresh the regex cache for `allowed_domains`
for mw in self.crawler.engine.scraper.spidermw.middlewares:
if isinstance(mw, scrapy.spidermiddlewares.offsite.OffsiteMiddleware):
mw.spider_opened(self)
</code></pre>
<p>上面的代码应该在响应回调中调用,因此<code>self</code>这里应该是spider类的一个实例。在</p>
<p>另请参见:</p>
<ul>
<li><a href="https://github.com/scrapy/scrapy/blob/master/scrapy/spidermiddlewares/offsite.py" rel="noreferrer">Source code of ^{<cd12>} on GitHub</a></li>
</ul>