用Python建立一个网络爬虫垃圾邮件列表

2024-09-30 02:20:00 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们,我不想做任何恶意的事,我只是需要做些功课。我是一个相当新的程序员,我正在使用python3.0,我很难使用递归来解决问题。我在这个问题上纠结了好一阵子。这是

作业:

  1. 编写一个递归方法spam(url,n),该方法以网页的url为输入,非负整数n,收集网页中包含的所有电子邮件地址,并将它们添加到全局字典变量spam_dict中,然后在网页中包含的每个http链接上递归地调用自己。

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

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

注:

  1. 直接运行spam()将不会在屏幕上产生任何输出;要找到您的spam_dict,您需要读取spam_dict的值,并且您还需要在每次运行spam之前将其重置为空字典。在
  2. 回想一下如何使用全局变量。在

用法:

>>> spam_dict = {}
>>> spam('http://reed.cs.depaul.edu/lperkovic/csc242/test1.html',0)
>>> spam_dict.keys()  
dict_keys([])  
>>> spam_dict = {}  
>>> spam('http://reed.cs.depaul.edu/lperkovic/csc242/test1.html',1)
>>> spam_dict.keys()
dict_keys(['lperkovic@cs.depaul.edu', 'nobody@xyz.com'])

到目前为止,我已经编写了一个函数,它遍历网页并将所有链接放入一个漂亮的小列表中,我想做的是调用该函数。为什么我要在字典上使用递归呢?怎么办?我不明白这一切是怎么联系在一起的。在

^{pr2}$

任何输入(除了为什么垃圾邮件是坏的)将不胜感激。如果我能更好地理解以上的功能,我也可以这么做。然而,我所需要的是让程序产生正确的输出。在

添加:

我编写了一个从页面收集电子邮件的函数,但我不知道如何将.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?我在文件里找不到。在


Tags: 方法函数httpurl网页字典电子邮件地址
2条回答

想想递归是如何工作的。你想要的是你的函数在某些情况下能够调用它自己。在这种情况下,您需要为您的函数添加递归级别的参数,然后您需要确定它在各种情况下应该做什么?在

在最基本的层面上,它应该如何处理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)

相关问题 更多 >

    热门问题