第二条线的目的是什么?我们难道不一定要作为seed
参数传入一个列表吗?我认为您可以在我们的tocrawl
变量的所有区域中使用seed,而不是在列表中使用列表。在
def crawl_web(seed):
tocrawl = [seed]
crawled = []
while tocrawl:
page = tocrawl.pop()
if page not in crawled:
union(tocrawl, get_all_links(get_page(page)))
crawled.append(page)
return crawled
编辑:完整脚本-http://codepad.org/qxuzVkof
seed
不是一个列表,而是一个项目,很可能是要爬网的第一个页面的URL。在虽然可以更改函数的设计以允许多个种子URL,但这会使函数的签名复杂化-几乎每个调用方都只想从一个URL抓取。让函数修改调用者的变量也是一种不好的风格;如果函数将采用参数
tocrawl
,则必须记录(并让每个调用者都知道):tocrawl
表示作为初始起点的所有urltocrawl
必须是list
(或兼容类型);普通的iterable不支持pop
。它还必须符合union
期望的属性。这是非常不和谐的。在tocrawl
将包含尚未爬网的url的快照。在由于最后两点本质上意味着输入参数将被破坏,一个更好的设计是使参数成为任意可编辑的,然后然后构造一个列表。这样,打电话的人就不用担心这些愚蠢的惯例了。在
还有一件事:与其编写自己的} ,如下所示:
union
实现并使用列表来存储所有已爬网的网站,您应该考虑在两个实例中使用^{dr您的seed值不是一个列表,tocrawl不应该是一个列表(它应该是一个支持联合的数据结构,例如set)
这是基本的图遍历算法。如果不了解一个变量的背景,很难解释它的重要性,所以请允许我过分放纵你。>;:)
网络是数学家们喜欢称之为图的东西。web上的每个地址都是图中的一个节点,一个链接(连接两个地址)称为边。所以“爬网”就是在网络图中沿着链接边缘找到指向不同地址节点的路径。在
在每一个节点,你都要检查新的节点来访问,你可以从当前的节点访问这些节点。但是您必须从某个地方开始;这里的代码通过将已知的、未访问的节点列表初始化为
^{pr2}$seed
,从节点seed
开始:您还需要跟踪访问过的节点,这样就不会一直绕圈子:
然后你必须开始你的穿越。继续爬网,直到没有更多节点可爬网。公司名称:
循环的每次迭代都将访问另一个节点,我们从列表中获得该节点(最初只是
seed
节点),方法是从末尾弹出一个值:不要访问以前爬网的节点;只需继续:
我不认为在python中,你不能在列表上进行联合,你可能需要创建一个集合来执行以下操作:
但它的要点是,你收集了当前节点的所有边,并将它们的节点添加到列表中(set?)已知的,未绘制的地址。可以按以下方式定义列表联合函数,注意它不保留顺序:
最后,请记住您已经访问过当前地址!在链接圈中单击(循环是技术术语,循环如果节点自身有边)
所有的地址都可以从你的地址列表中找到。在
现在让我们来看看整个事情的来龙去脉:
在这个算法中,seed是一个页面,而不是一个列表。在
tocrawl是一个堆栈,您可以在其中收集要访问的链接页面,以便找到更多链接。在
相关问题 更多 >
编程相关推荐