当前位置: 代码迷 >> python >> 我如何知道我何时完成了对域的抓取?
  详细解决方案

我如何知道我何时完成了对域的抓取?

热度:63   发布时间:2023-07-16 10:06:32.0

我用 Python 编写了一个函数,用于获取页面上的所有链接。 然后,我为第一个函数返回的所有链接运行该函数。

我的问题是,如果我继续使用 CNN 作为我的起点,我怎么知道我什么时候已经抓取了 CNN 的所有(或大部分)网页?

这是爬虫的代码。

base_url = "http://www.cnn.com"
title = "cnn"
my_file = open(title+".txt","w")

def crawl(site): 
    seed_url = site
    br = Browser()

    br.set_handle_robots(False)
    br.set_handle_equiv(False)

    br.open(seed_url)

    link_bank = []

    for link in br.links():
        if link.url[0:4] == "http":
            link_bank.append(link.url)
        if link.url[0] == "/":
            url = link.url
            if url.find(".com") == -1:
                if url.find(".org") == -1: 
                    link_bank.append(base_url+link.url)
                else:
                    link_bank.append(link.url)
            else:
                link_bank.append(link.url)

        if link.url[0] == "#":
            link_bank.append(base_url+link.url)

    link_bank = list(set(link_bank))

    for link in link_bank:
        my_file.write(link+"\n")

    return link_bank

my_file.close()

我没有专门研究你的代码,但你应该看看如何实现广度优先搜索,并将已经访问过的 URL 存储在一个set 如果您在当前访问的页面中发现了一个新 URL,请将它附加到要访问的 URL 列表中(如果它不在set

您可能需要忽略查询字符串(URL 中问号之后的所有内容)。

我想到的第一件事是拥有一visited链接。 每次请求链接时,请添加指向集合的链接。 在请求链接之前,请检查它是否不在集合中。

另一点是您实际上是在这里重新发明轮子, 网页抓取框架内置了- 值得使用。

希望有帮助。

  相关解决方案