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



我正在开发一个网络爬虫应用程序。它将列出一个给定域的所有链接作为分类网站地图的一部分。我使用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))并接收第二组链接,以此类推。但是第三步、第四步或第五步呢?

我将如何抓取整个网站的所有其他页面和其他页面有链接在前面的页面?每个页面的链接数量是不可预测的,所以我不能使用eachtimes。我怎样才能一直访问所有页面和其他嵌套页面,并跟踪它们的链接?

您所需要做的就是跟踪哈希中的绝对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,包括协议,主机,端口和路径

正如您所提到的,eachtimes将在迭代器预先固定时使用。当没有固定迭代器时,需要使用像loopwhileuntil这样的循环,并在找到所有链接后退出循环。

最新更新