建立一个深度优先的网络蜘蛛,意味着它将访问第一页上的所有链接,并转到每个链接,并访问所有第二页上的链接...
你应该使用递归吗?我发现这是cpu密集型.
def recursion()
linkz_on_first_page.each do |link|
recursion(link)
end
end
recursion(firstpage)
Run Code Online (Sandbox Code Playgroud)
Lor*_*nVS 12
绝对不是,由于万维网的实际性质,你很快就会遇到问题.第二个你点击一个主导航部分的网站,每个页面链接到另一个页面,你已进入一个无限循环.
你可以跟踪你已经处理过哪些链接,但即便如此,递归循环并不真正适合万维网的性质(尽管最初认为,网络更像是一个真实的"网络"而不是一颗树).您最好找到当前页面上的所有链接,并将这些链接(如果它们尚不存在)添加到中央队列,并在您到达时逐步处理每个链接的队列(请记住跟踪您已完成处理的链接,或者您将它们再次添加到队列的末尾)
与其说递归是CPU密集型的(实际上不是),不如说在几千个递归调用之后你会炸毁你的调用堆栈——你很容易在编写一个在开放互联网上运行的网络蜘蛛时遇到这种情况。
例子:
def blow_stack(level=0)
puts "at level #{level}"
blow_stack(level+1)
end
Run Code Online (Sandbox Code Playgroud)
在我的 Macbook pro 上的输出:
irb(main):009:0> blow_stack
at level 0
at level 1
... (skip a bunch of output)
at level 6295
at level 6296
SystemStackError: stack level too deep
from (irb):7:in `blow_stack'
from (irb):7:in `blow_stack'
from (irb):9
from :0
Run Code Online (Sandbox Code Playgroud)