code4craft / webmagic

A scalable web crawler framework for Java.
http://webmagic.io/
Apache License 2.0
11.37k stars 4.18k forks source link

调整重试逻辑 #1170

Open niuxiaozu opened 2 months ago

niuxiaozu commented 2 months ago

修改download成功后对状态码的处理,如果状态码不被site.acceptStatCode接收的话就算失败,进行doCycleRetry重试逻辑。并且加入队列前先sleep。

sutra commented 2 months ago

原本的设计是只在发生异常的时候才去 doCycleRetry

niuxiaozu commented 2 months ago

主要是缺少一个处理状态码错误的方式,之前我是通过继承HttpClientDownloader,在内部判定状态码不对的情况将page。downloadSuccess设置为false,但总感觉不太好,后面才选用的这种方式。如果你觉得设计不是这样的,那就算啦,不过我感觉确实得有一个处理状态码不对时的重试逻辑

sutra commented 2 months ago

我推荐用 SpiderListener 来实现,甚至那些内置的重试,都可以统一改成这种机制。

niuxiaozu commented 2 months ago

那样得大改了,我只是借用现有的机制小做修改😅

sutra commented 2 months ago

如果仅仅是使用 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: @.***>

niuxiaozu commented 2 months ago

好像不行,因为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;
    }
sutra commented 2 months ago

实现这个 us.codecraft.webmagic.SpiderListener.onSuccess(Request),在这个里面去判断 status code 试试。

niuxiaozu commented 2 months ago

这样是可以的,我先试试吧,感谢