【问题标题】:How do I know when I'm done crawling a domain?我如何知道我何时完成了对域的爬网?
【发布时间】:2014-05-01 05:06:27
【问题描述】:

我用 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()

【问题讨论】:

    标签: python web-crawler mechanize


    【解决方案1】:

    我没有专门查看您的代码,但您应该查看如何实现广度优先搜索,并将已访问的 URL 存储在 set 中。如果您在当前访问的页面中找到新 URL,请将其附加到要访问的 URL 列表中,如果它不在 set 中。

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

    【讨论】:

      【解决方案2】:

      我首先想到的是拥有setvisited 链接。每次请求链接时,将链接添加到集合中。在请求链接之前,请检查它是否不在集合中。

      另外一点是你实际上是在重新发明轮子,Scrapy web-scraping 框架内置了link extracting mechanism - 值得使用。

      希望对您有所帮助。

      【讨论】:

      • 我看了一下scrapy,但是安装起来非常费劲。但我认为 set() 的想法会奏效。
      • @kttr 你研究过 Scrapy,它有帮助吗?
      • 这是过去的爆炸,哈哈。我只是使用 Google 的自定义搜索引擎 API 来搜索特定网站,因为它的结果比我自己做的任何事情都要好得多。至于 Scrapy,现在我已经有了将近 2 年的编程经验,它看起来更容易访问和有用:P。 (但从那以后我就不需要使用它了)。
      • @kttr 是的,浏览旧答案并清理 :)
      猜你喜欢
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多