webmagic icon indicating copy to clipboard operation
webmagic copied to clipboard

关于setSleepTime的疑问

Open stonesun opened this issue 11 years ago • 4 comments

Site对象有方法setSleepTime。

我对这个方法有些疑惑。这个方法是要实现什么样的效果呢?

我臆断作者原意应该是希望达到这样的效果:我爬取一个网站的时候,希望对它友好,不会爬取过于频繁被对方加入黑名单。所以我设置一个时间,让我的蜘蛛每隔n毫秒内才爬取对方一次。

但是,看代码:

protected void processRequest(Request request) {
    Page page = downloader.download(request, this);
    if (page == null) {
        sleep(site.getSleepTime());
        onError(request);
        return;
    }
    // for cycle retry
    if (page.isNeedCycleRetry()) {
        extractAndAddRequests(page, true);
        sleep(site.getSleepTime());
        return;
    }
    pageProcessor.process(page);
    extractAndAddRequests(page, spawnUrl);
    if (!page.getResultItems().isSkip()) {
        for (Pipeline pipeline : pipelines) {
            pipeline.process(page.getResultItems(), this);
        }
    }
    sleep(site.getSleepTime());
}

protected void sleep(int time) {
    try {
        Thread.sleep(time);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

设置sleepTime会导致_当前线程_挂起一段时间。但是其他线程将不受影响。

请问作者是有意这样设计的吗?对于我上述需求,作者有什么指导吗?

stonesun avatar Jun 22 '14 12:06 stonesun

这里我的想法是,框架提供最大的灵活性。 1、针对有可能封爬虫的网站 2、针对无封爬虫的网站 第1钟,你可以设置为单线程(这里暂时不讨论效率问题)来抓,设置一定的间隔时间。可以达到反封锁的效果。 针对第2钟,启用多线程方式,可以加快爬取网站页面的效果。 欢迎大家一块来讨论。

fengwuze avatar Jun 22 '14 12:06 fengwuze

sleepTime的作用,两位都没说错。至于跟多线程如何配合,其实原因是:有sleepTime的时候,还没有多线程呢…

但是如果多个Spider共享线程池,那么在这里sleep不是太合理。考虑改进一下。

code4craft avatar Jun 23 '14 00:06 code4craft

这个sleep问题什么时候处理呀?

cooingandwooing avatar Mar 13 '23 08:03 cooingandwooing

您的邮件我已收到,祝你天天开心! 

LyuXiaobu avatar Mar 13 '23 08:03 LyuXiaobu