我一直在考虑解决这个问题的方法,但我找不到任何让我信服的解决方案。我正在编写一个爬虫程序,我从URL列表中为每个URL设置了下载任务。此外,根据站点URL和我想要的信息,以不同的模式解析不同的html文档。所以我的问题是如何将每个任务与其适当的解析链接起来。
这些想法是:
创造一个巨大的' if'检查下载类型并关联解析。 (避免,因为' if'正在增长,每个新的不同网站都添加到抓取工具中)
使用多态,为每个不同的站点创建不同的下载任务,并与我想要获取的信息类型相关,然后使用后处理链接解析。 (每个新解析器再次增加复杂性)
所以我正在寻找某种软件模式或想法:
嘿我是这个信息的下载任务
真的?然后你需要这个解析来提取它。这是你需要的解析。
其他信息:
架构非常简单。一个包含URL的列表,它是爬虫的种子。下载页面的制作人。已下载html文档的其他列表。并且应该为页面应用正确解析的消费者。
根据页面下载,有时我们需要使用解析A或解析B等。
修改
一个例子:
我们有三个网站网站:site1.com,site2.com和site3.com
我们需要解析三种网址类型:site1.com/A,site1.com/B,site1.com/C,site2.com/A,site2.com/B,site2.com/C,。 .. site3.com/C
它解析的每个网址都不同,通常在site1.com/A之间提供相同的信息 - site2.com/A - site3.com/A; ......; site1.com/C - site2.com/C - site3.com/C
答案 0 :(得分:0)
看起来Genetic Algorithm aproached解决方案适合您对问题的描述,首先需要找到的是基础(原子)解决方案。
以下是维基百科的一个小小的描述:
在遗传算法中,针对优化问题的候选解决方案群体(称为个体,生物或表型)朝着更好的解决方案发展。每个候选解决方案都有一组可以突变和改变的属性(染色体或基因型);传统上,解决方案以二进制表示为0和1的字符串,但其他编码也是可能的。[2]
进化通常从一群随机生成的个体开始,并且是一个迭代过程,每次迭代中的种群称为一代。在每一代中,评估人口中每个人的适应性;适应度通常是要解决的优化问题中目标函数的值。从当前群体中随机选择更适合的个体,并且修改每个个体的基因组(重组并且可能随机突变)以形成新一代。然后,在算法的下一次迭代中使用新一代候选解决方案。通常,当生成最大代数或者达到满意的健康水平时,算法终止。
典型的遗传算法需要:
解决方案域的遗传表示, 用于评估解决方案域的适应度函数。 每个候选解决方案的标准表示形式是一个位数组。[2]可以以基本相同的方式使用其他类型和结构的阵列。使这些遗传表示方便的主要特性是它们的部件由于其固定的尺寸而易于对准,这有利于简单的交叉操作。也可以使用可变长度表示,但在这种情况下交叉实现更复杂。在遗传编程中探索了树状表示,并在进化规划中探索了图形表示;在基因表达式编程中探索了线性染色体和树木的混合。
一旦确定了遗传表示和适应度函数,GA就会初始化一组解决方案,然后通过重复应用变异,交叉,反演和选择算子来改进它。
答案 1 :(得分:0)
我会以某种形式(如XML)外化解析模式/结构并动态使用它们。
例如,我必须将site1.com下载为site2.com。两者都有两种不同的布局。我将创建两个包含布局模式的xml。
一个主xml可以容纳哪个url应该使用哪个xml。
启动时加载此主xml并将其用作字典。当你必须下载时,下载页面并从字典中找到xml并传递字典并流到解析器(单个通用解析器),它可以根据Xml流和xml信息读取流。
通过这种方式,我们可以在xml中创建常用模式并使用它来读取类似的站点。在xml模式中使用正则表达式来覆盖单个xml中的大多数站点。
如果布局完全不同,只需创建一个xml并修改它的主xml。
这个设计的秘诀/成功是你如何创建这样的通用xmls,它完全取决于你需要什么以及解析后你正在做什么。
答案 2 :(得分:0)
这似乎是一个连接问题。我建议考虑快速查找算法。
请点击此处了解更多详情。 http://jaysonlagare.blogspot.com.au/2011/01/union-find-algorithms.html
这是一个简单的java示例, https://gist.github.com/gtkesh/3604922