Open niuxiaozu opened 2 months ago
原本的设计是只在发生异常的时候才去 doCycleRetry
。
主要是缺少一个处理状态码错误的方式,之前我是通过继承HttpClientDownloader,在内部判定状态码不对的情况将page。downloadSuccess设置为false,但总感觉不太好,后面才选用的这种方式。如果你觉得设计不是这样的,那就算啦,不过我感觉确实得有一个处理状态码不对时的重试逻辑
我推荐用 SpiderListener
来实现,甚至那些内置的重试,都可以统一改成这种机制。
那样得大改了,我只是借用现有的机制小做修改😅
如果仅仅是使用 SpiderListener 来处理 status code,是不需要修改 webmagic 代码的,直接在自己的代码里加 SpiderListener 并注册就好了。Sent from my iPhoneOn Jun 17, 2024, at 5:35 PM, Niu_XZ @.***> wrote: 那样得大改了,我只是借用现有的机制小做修改😅
—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you commented.Message ID: @.***>
好像不行,因为onError只有在抛出异常的时候才调用,而状态码不对的时候,不抛出异常,只是打了个log
private void onDownloadSuccess(Request request, Page page) {
if (site.getAcceptStatCode().contains(page.getStatusCode())){
pageProcessor.process(page);
extractAndAddRequests(page, spawnUrl);
if (!page.getResultItems().isSkip()) {
for (Pipeline pipeline : pipelines) {
pipeline.process(page.getResultItems(), this);
}
}
} else {
logger.info("page status code error, page {} , code: {}", request.getUrl(), page.getStatusCode());
}
sleep(site.getSleepTime());
return;
}
实现这个 us.codecraft.webmagic.SpiderListener.onSuccess(Request)
,在这个里面去判断 status code 试试。
这样是可以的,我先试试吧,感谢
修改download成功后对状态码的处理,如果状态码不被site.acceptStatCode接收的话就算失败,进行doCycleRetry重试逻辑。并且加入队列前先sleep。