我不确定我们在说什么语言,所以我会笼统地说。
您需要为每个 URL 建立一个数据结构,以跟踪从中生成了多少“子”页面。每当一个 URL 被爬取时,它都会有一个“父”数据结构。每当找到新页面时,都会将其添加到父级的树数中。每当一个页面被爬取时,父级的树数就会减少。这需要以同步的方式完成,因为多个线程将对其进行更新。
您实际上可能想要保存整个 URL 结构。根 URL“http://foo.x/”有指向“/1.html”和“/2.html”的链接,所以它的子数是 2。根 URL 有一个null
父级和“1”和“2” " 有根的父级。当“1.html”被爬取时,根的子节点数减为 1。但如果“1.html”内有 3 个链接,则根的计数增加到 4。如果你想跟踪树然后“1.html”子项计数变为 3,依此类推。然后,当“1.html”的子项之一被爬取时,“1.html”的计数变为 2,根 URL 的计数变为 3。
您当然不希望保留线程,然后像您提到的那样稍后加入 - 您的线程数会爆炸。您应该使用线程池并将 URL 提交给蜘蛛,每个 URL 及其在 URL 树中的关联节点,以便它们可以被相同的线程蜘蛛蜘蛛。
当一个 URL 被爬取,并且子项计数变为 0 时,您就知道您已经爬取了整个树,并且该 URL 可以从工作列表中删除并移动到完成列表中。同样,这些列表需要同步,因为多个线程将在它们上运行。
希望这会有所帮助。