如何在不可预测的结果下创建嵌套循环

时间:2014-03-26 00:42:55

标签: ruby-on-rails ruby

我正在开发一个网络抓取工具。它将列出给定域的所有链接作为分类站点地图的一部分。我正在使用Nokogiri gem来解析和搜索HTML。此代码适用于单个页面:

doc = Nokogiri::HTML(open("url"))
links = doc.css("a")

unless links.blank?
    links.each do |t|
        if t["href"].first == "/"
            // link stuff
        end
    end
end

在注释行中,我可以执行另一个doc = Nokogiri::HTML(open(t_URL))并接收第二组链接,依此类推。但是第3,第4或第5步呢?

如何抓取整个网站的所有其他网页以及之前页面中包含链接的其他网页?每页的链接数量无法预测,因此我无法使用eachtimes。如何访问所有页面和其他嵌套页面并跟踪所有页面的链接?

2 个答案:

答案 0 :(得分:0)

正如您所提到的,预先修复迭代器时将使用eachtimes。如果没有固定的迭代器,则需要使用loopwhileuntil之类的循环,并在找到所有链接时将其中断。

答案 1 :(得分:0)

您需要做的就是跟踪散列中的绝对URL。散列的值可以是计数,或者您可能想要跟踪上次使用时间戳抓取每个页面的时间。请注意,当您刮擦时,您应该只获得href s:

to_visit = {"url" => Time.now}

while !to_visit.empty? do

  doc = Nokogiri::HTML(open(to_visit.shift.first))

  doc.css("a[href]").each do |link|
    url = make_absolute(link)
    to_visit[url] = Time.now #add this page to the to_visit 'list'
  end

end

您需要定义make_absolute,其中应创建一个完整的URL,包括协议,主机,端口和路径。