擅长:python、mysql、java
<p>在<code>create_jobs</code>中,您正在调用<code>crawl</code>,如果只是这样就可以了。但是由于您也在从<code>crawl</code>调用<code>create_jobs</code>,所以您可能会进入一个无限循环。如果没有条件<code>len(queued_links) > 0</code>,它将是一个无限循环。为了防止此类问题(避免堆栈溢出),python有一个递归限制(请参见:<a href="https://stackoverflow.com/questions/3323001/maximum-recursion-depth">What is the maximum recursion depth in Python, and how to increase it?</a>)。你知道吗</p>
<p>这里的问题是,一个网页很可能包含指向其他网页的链接,因此停止循环的情况不会经常发生。这就是为什么要达到递归极限。您可以通过执行以下操作来增加此限制(此处获取的代码片段:<a href="https://stackoverflow.com/questions/8177073/python-maximum-recursion-depth-exceeded">Python: Maximum recursion depth exceeded</a>),但我不建议您这样做:</p>
<pre><code>import sys
sys.setrecursionlimit(10000) # 10000 is an example, try with different values
</code></pre>
<p>解决这个问题的好方法是将算法的设计改成这样(基本上是在爬行时对填充的数组进行迭代,而不是进行递归调用):</p>
<pre><code>def crawl(url):
return [url+'a', url+'b']
links = ['foo', 'bar']
for link in links:
links.extend(crawl(link))
</code></pre>
<p>考虑到算法有时有效有时无效的事实,页面很可能会随着时间的推移而改变,如果您真的接近递归限制,那么根据生成的页面,您是否达到了该限制可能会告诉我。你知道吗</p>
<p>最后,并不是因为只有100个链接,所以不能达到1000个递归限制。事实上,比如你的爬网函数会调用其他函数,等等。。。有些递归是隐藏的。你知道吗</p>