Skip to main content
 首页 » 编程设计

python之如何将其包装成递归调用

2025年05月04日18cyq1162

我正在用 python 写一个小蜘蛛。它点击一个页面,根据模式获取页面上的所有链接,转到每个页面,然后重复。

我需要以某种方式使它递归。以下是网址格式:

www.example.com 

然后我根据正则表达式获取所有链接,然后我访问每个页面。

递归部分:

假设我正在访问一个 url 如下的页面:

www.example.com/category/1 

现在,如果此页面包含如下链接:

www.example.com/category/1_234 

(基本上相同的 url,除了它有一个额外的“_234234”)

我访问那个页面,然后检查一个 url,比如:

www.example.com/category/1_234_4232 

(同样,相同的 url 加上下划线和数字)

我一直这样做,直到没有更多符合此模式的链接。

1. visit a category page 
2. does it contain links with the same url + "_dddd" if yes, visit that page 
3. back to #2 unless no links 

我不需要正则表达式,我只需要构造递归调用的帮助。

请您参考如下方法:

按照您所要求的方式,只是递归可能不是最好的方法。

一方面,如果要索引的页面超过 1000 个,您可能会“触底”调用堆栈并崩溃。另一方面,如果您在递归期间不小心释放变量,它最终可能会消耗相当多的内存。

我会推荐更多类似的东西:

visit_next = set(['www.example.com']) 
visited = set() 
 
while len(visit_next): 
    next_link = visit_next.pop() 
    if next_link not in visited: 
        visited.add(next_link) 
        for link in find_all_links_from(next_link): 
            if link not in visited: 
                visit_next.add(link) 

编辑:

按照建议,我用集合重写了这个;这应该使用更少的内存(在长时间的遍历中,visit_next 列表几乎肯定会收集许多重复链接)。