/ 详情

队列元素重复

Backlog
Opened this issue  
2017-02-08 11:24

场景:抓取某网站信息在linux上跑,由于某种原因爬虫停了,然后手动kill掉再重启就会出现 不知道和#44:重复抓取报“队列元素重复”一样不

队列元素重复[group=seeds, key=download_http://www.xxx.com/s/#http://www.xxx.com/s/]
  <page name="内容页" isPersisted="1" extractor="HtmlCleaner"><!-- 如果不配置extractor属性,则使用默认的 -->
			<url-match-rule type="regex" value="^http://www\.xxx\.com/\w+/\d+\.html$" />
				<model>
				    <field name="标题" xpath="" />
				   ...
			    </model>
		</page>
		<page name="列表页" extractor="HtmlCleaner">
			<url-match-rule type="regex">
			^http://www\.xxx\.com/((s/)|(search/r.*))$
			</url-match-rule>
			<model>
				<field name="详情URl" isForNewTask="1" isArray="1"  xpath="..." attr="href">
				</field> 
				<field name="分页URL" isForNewTask="1" isArray="1" isDistinct="1" xpath="... attr="href">
				</field>
			</model>
		</page>

Comments (8)

cgnq created 任务

再问一下,配置文件的日志级别好像不好使?

看了看源码,scheduler.period 配置0的时候默认InitialSeeds的execute方法

group -> {
						context.getTaskManager().removeKeys(group);
						logger.warn("清除Keys成功[group="+group+"]");
					}

这段好像没有执行,这个逻辑不知道是对还是不对,或者是我代码没有看全,还有其他用意?

队列元素重复,是因为./store目录下面有一个持久化db保存了你采集过的网页地址,你重新启动之前手动删除这些文件就可以了。

@cgnq 日志级别确实暂时没有生效。 :joy:

@cgnq scheduler.period 配置0的时候,只会执行InitialSeeds的execute方法,run方法是在period大于0的时候,每次重新调度的时候执行的。

@cgnq 你仔细看,run方法末尾也是调用了一次execute方法的,run方法上面的部分是用于分布式环境【开启zbus】下的清除keys的作用。单机环境下是不需要的

@自风 感谢回复,我的种子地址,被page name="列表页" 解析后放入BDb,下次重启的时候程序发现种子地址在BDb中,所以就重复了,能否在执行种子之前先把不持久化的page给清理一下?
我现在方法是该配置文件,再加一个page name="seed" 然后用equals匹配我的种子地址,那个page name="列表页"不再匹配我的种子地址.不知道这样可行不

@cgnq 目前,种子地址在每次schedule(周期重启)的时候是会清除的,但人工重启确实没有加上程序去清除,我考虑加上这个逻辑。

Sign in to comment

状态
Assignees
Milestones
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
Branches
Planed to start   -   Planed to end
-
Top level
Priority
参与者(2)
117 l weiwei 1578913730