使用python中的web爬虫创建垃圾邮件列表

使用python中的web爬虫创建垃圾邮件列表,python,Python,嘿,伙计们,我不想做任何恶意的事情,我只需要做一些家庭作业。我是一个相当新的程序员,我使用的是Python3.0,我很难使用递归来解决问题。我在这个问题上纠缠了好一阵子。这是我的建议 任务: 编写一个递归方法spam(url,n),该方法将网页的url作为输入和非负整数n,收集网页中包含的所有电子邮件地址并将其添加到全局字典变量spam_dict中,然后递归调用网页中包含的每个http链接 您将使用字典,因此每个电子邮件地址只保存一份副本;您的字典将存储(键、值)对(电子邮件、电子邮件)。递归

嘿,伙计们,我不想做任何恶意的事情,我只需要做一些家庭作业。我是一个相当新的程序员,我使用的是Python3.0,我很难使用递归来解决问题。我在这个问题上纠缠了好一阵子。这是我的建议

任务:
  • 编写一个递归方法spam(url,n),该方法将网页的url作为输入和非负整数n,收集网页中包含的所有电子邮件地址并将其添加到全局字典变量spam_dict中,然后递归调用网页中包含的每个http链接

  • 您将使用字典,因此每个电子邮件地址只保存一份副本;您的字典将存储(键、值)对(电子邮件、电子邮件)。递归调用应该使用参数n-1而不是n。如果n=0,则应收集电子邮件地址,但不应进行递归调用。参数n用于将递归限制为最大深度n

  • 您需要使用上述两个问题的解决方案;您的方法spam()将调用方法links2()和emails(),还可能调用其他函数

    笔记:
  • 直接运行spam()将不会在屏幕上产生任何输出;要查找您的spam_dict,您需要读取spam_dict的值,并且您还需要在每次运行spam之前将其重置为空字典
  • 回想一下全局变量是如何使用的
  • 用法: 到目前为止,我已经编写了一个遍历网页并将所有链接放入一个漂亮的小列表中的函数,我想做的是调用该函数。为什么我要在字典上使用递归呢?怎么做?我不明白n和这一切有什么关系

    def links2(url):
        content = str(urlopen(url).read())
        myparser = MyHTMLParser()
        myparser.feed(content)
        lst = myparser.get()
        mergelst = []
        for link in lst:
            mergelst.append(urljoin(lst[0],link))
        print(mergelst)
    
    任何输入(除了为什么垃圾邮件是坏的)将不胜感激。此外,我意识到上述功能可能看起来更好,如果你有办法做到这一点,我洗耳恭听。然而,我所需要的只是让程序产生正确的输出

    补充: 我写了一个从页面收集电子邮件的功能,但我不知道如何将.com和.edu以及.org合并在一起

    from re import findall
    def emails(url): 
        links = str(links3(url)) 
        # how do I construct pattern? 
        pattern='[A-Za-z0-9_.]+\@[A-Za-z0-9_.]+.com\.edu\.org 
    
        lst = findall(pattern,links) 
        print(lst) 
    

    我该怎么告诉python呢?我在文档中找不到它。

    想想递归是如何工作的。您希望函数在某些情况下能够调用自身。在这种情况下,您需要向函数中添加递归级别的参数,然后您需要弄清楚它在各种情况下应该做什么

    在最基本的层面上,n=0时它应该做什么?(提示:你已经知道了)

    如果n=1,它应该怎么做?您可能希望在n=0的情况下对现有列表中的每个元素再次调用函数


    如果n大于1呢?到目前为止,您希望在每个元素上使用n=n-1再次调用函数。

    想想递归是如何工作的。您希望函数在某些情况下能够调用自身。在这种情况下,您需要向函数中添加递归级别的参数,然后您需要弄清楚它在各种情况下应该做什么

    在最基本的层面上,n=0时它应该做什么?(提示:你已经知道了)

    如果n=1,它应该怎么做?您可能希望在n=0的情况下对现有列表中的每个元素再次调用函数


    如果n大于1呢?到目前为止,您希望在每个元素上使用n=n-1再次调用您的函数。

    n
    将递归限制为最大“调用深度”,正如问题所述,它将发挥作用

    其思想是,由于您递归地调用已运行扫描中的电子邮件扫描,因此您建立了一个调用堆栈,其中包含所调用的内容,当您继续递归地调用扫描仪时,这些内容会越来越深

    你不希望它永远持续下去,所以作为一个参数,你传递一个整数,每次你打电话时,这个整数都会递减。当它达到0时,您将停止执行递归调用,并让递归序列自行展开

    call 1 (args...., n=3)
       call 2a (args...., n=2)
           call 3 (args...., n=1)
                call 4a (args..., n=0) <-- these calls won't call more scans
                call 4b (args..., n=0) <-- because n=0, so this is max depth
       call 2b (args...., n=2)
    
    调用1(参数….,n=3)
    呼叫2a(args…,n=2)
    呼叫3(args…,n=1)
    
    调用4a(args…,n=0)
    n
    将通过将递归限制在最大“调用深度”来发挥作用,正如问题所述

    其思想是,由于您递归地调用已运行扫描中的电子邮件扫描,因此您建立了一个调用堆栈,其中包含所调用的内容,当您继续递归地调用扫描仪时,这些内容会越来越深

    你不希望它永远持续下去,所以作为一个参数,你传递一个整数,每次你打电话时,这个整数都会递减。当它达到0时,您将停止执行递归调用,并让递归序列自行展开

    call 1 (args...., n=3)
       call 2a (args...., n=2)
           call 3 (args...., n=1)
                call 4a (args..., n=0) <-- these calls won't call more scans
                call 4b (args..., n=0) <-- because n=0, so this is max depth
       call 2b (args...., n=2)
    
    调用1(参数….,n=3)
    呼叫2a(args…,n=2)
    呼叫3(args…,n=1)
    
    呼叫4a(args…,n=0)快速问题。。。我写了一个从页面收集电子邮件的功能,但我不知道如何将.com和.edu以及.org合并在一起。从重新导入findall def电子邮件(url):links=str(links3(url))模式='[A-Za-z0-9.]+\@[A-Za-z0-9.]+.com\.edu\.org;如何正确执行上述操作?lst=findall(pattern,links)print(lst)如何告诉python?我在文档中找不到它。简单的regexp替换与
    …@[\w\.]+\(com|edu|org)
    一样简单。此外,最好添加到原始问题中,而不是尝试将其塞进这个小框中。我这样做是为了你(见上面的“补充:”快速提问。。。我写了一个从页面收集电子邮件的功能,但我不知道如何将.com和.edu以及.org合并在一起。从重新导入findall def电子邮件(url):links=str(links3(url))模式='[A-Za-z0-9.]+\@[A-Za-z0-9.]+.com\.edu\.org;如何正确执行上述操作?lst=findall(pattern,links)print(lst)如何告诉python?我在文档中找不到它