1

我正在在线查看有关如何构建搜索引擎的代码(下面的链接)。作为一个新手程序员,我很难解释循环的方式。

红宝石代码:

def crawl_web(urls, depth=2, page_limit = 100)
  depth.times do
    next_urls = []
    urls.each do |url|
      url_object = open_url(url)
      next if url_object == nil                                      # [1]
      url = update_url_if_redirected(url, url_object)
      parsed_url = parse_url(url_object)
      next if parsed_url == nil
      @already_visited[url]=true if @already_visited[url] == nil     # [2]
      return if @already_visited.size == page_limit                  # [3]
      next_urls += (find_urls_on_page(parsed_url, url)-@already_visited.keys)
      next_urls.uniq!
    end
    urls = next_urls
  end
end

问题:

  1. 如果 url_object 为 nil,程序是否退出块并返回到“urls.each”行的开头?
  2. 这段代码是否显示:“如果我们正在查看的 url 已被访问,或者如果已经访问的 URL 为 nil?”
  3. 这个问题取决于我的第二个问题。如果问题 #2 中的其中一个语句为真......我们应该只在站点大小与 page_limit 相同的情况下返回唯一的 next_urls。

任何建议都有帮助!感谢您到目前为止的阅读!

链接: http ://www.skorks.com/2009/07/how-to-write-a-web-crawler-in-ruby/

4

1 回答 1

1
  1. 确实
  2. 它显示:@already_visited[url]如果我们之前没有访问过这个 url,则设置为 true
  3. 是的,只有当@already_visited“列表”的大小与页面的限制相同时才返回。它实际上并没有返回任何东西,大部分工作似乎都是在 instance variable 上完成的@already_visited,所以不需要返回任何东西。
于 2013-04-01T02:26:27.597 回答