【问题标题】:never ending for loop in website mapping crawler网站地图爬虫中的for循环永无止境
【发布时间】:2016-01-19 21:37:21
【问题描述】:

我正在开发我的第一个 python 项目。我想制作一个访问网站以提取其所有链接的爬虫(深度为 2)。它应该将链接存储在两个列表中,这些列表形成一个一对一的寄存器,将源链接与它们包含的相应目标链接相关联。然后它应该创建一个包含两列(目标和源)的 csv 文件,这样我就可以用 gephi 打开它来创建一个显示站点地形结构的图表。

代码在代码执行部分的 for 循环中发生故障,它永远不会停止提取链接......(我尝试过一个相当小的博客,它永远不会结束)。问题是什么?我该如何解决?

需要考虑的几点: - 我对编程和python真的很陌生,所以我意识到我的代码一定是非pythonic。另外,由于我一直在寻找构建代码和解决我的问题的方法,所以它有点不完整,抱歉。感谢您的帮助!

myurl = raw_input("Introduce URL to crawl => ")
Dominios = myurl.split('.')
Dominio = Dominios[1]

#Variables Block 1
Target = []
Source = []
Estructura = [Target, Source]
links = []

#Variables Block 2
csv_columns = ['Target', 'Source']
csv_data_list = Estructura
currentPath = os.getcwd()
csv_file = "crawleo_%s.csv" % Dominio


# Block 1 => Extract links from a page
def page_crawl(seed):
    try:
        for link in re.findall('''href=["'](.[^"']+)["']''', urllib.urlopen(seed).read(), re.I):
            Source.append(seed)
            Target.append(link)
            links.append(link)
    except IOError:
        pass

# Block 2 => Write csv file
def WriteListToCSV(csv_file, csv_columns, csv_data_list):
try:
        with open(csv_file, 'wb') as csvfile:
            writer = csv.writer(csvfile, dialect='excel', quoting=csv.QUOTE_NONNUMERIC)
            writer.writerow(csv_columns)
            writer.writerows(izip(Target, Source))
    except IOError as (errno, strerror):
            print("I/O error({0}): {1}".format(errno, strerror))
    return

# Block 3 => Code execution
page_crawl(myurl)
seed_links = (links)

for sublink in seed_links:        # Problem is with this loop
    page_crawl(sublink)
    seed_sublinks = (links)
## print Estructura               # Line just to check if code was working

#for thirdlinks in seed_sublinks: # Commented out until prior problems are solved
#   page_crawl(thirdlinks)

WriteListToCSV(csv_file, csv_columns, csv_data_list)

【问题讨论】:

  • 好吧,你在迭代时修改seed_links
  • 顺便说一句,你应该只对类使用大写和驼峰命名,而不是简单的变量或函数名称。有关详细信息,请参阅 Python 样式指南 PEP008
  • 谢谢,我去看看。

标签: python web-crawler


【解决方案1】:

seed_linkslinks 指向同一个列表。因此,当您在 page_crawl 函数中向 links 添加元素时,您也在扩展 for 循环正在循环的列表。您需要做的是clone the list,您在其中创建seed_links

这是因为 Python 通过引用传递对象。即多个变量可以以不同的名字指向同一个对象!

如果您想亲眼看到这一点,请在 for 循环中尝试 print sublink。您会注意到打印的链接比您最初输入的要多。您可能还会注意到您正在尝试在整个网络上循环:-)

【讨论】:

    【解决方案2】:

    我没有立即看出哪里出了问题。但是有几个关于此的评论:

    1. 您使用全局变量是不好的做法。您最好使用由 return 传回的局部变量。
    2. 二级链接是否可以引用一级链接?这样你就可以在数据中有一个循环。您需要为此做好准备以防止出现循环。因此,您需要调查返回的内容。
    3. 我将递归地实现这一点(使用前面的规定),因为这样可以使代码更简单,尽管更抽象一点。

    【讨论】:

    • 感谢cmets,以后会注意变量的使用方式。
    猜你喜欢
    • 2020-03-14
    • 2018-07-20
    • 2012-12-04
    • 2016-06-04
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多