webmagic
webmagic copied to clipboard
关于setSleepTime的疑问
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会导致_当前线程_挂起一段时间。但是其他线程将不受影响。
请问作者是有意这样设计的吗?对于我上述需求,作者有什么指导吗?
这里我的想法是,框架提供最大的灵活性。 1、针对有可能封爬虫的网站 2、针对无封爬虫的网站 第1钟,你可以设置为单线程(这里暂时不讨论效率问题)来抓,设置一定的间隔时间。可以达到反封锁的效果。 针对第2钟,启用多线程方式,可以加快爬取网站页面的效果。 欢迎大家一块来讨论。
sleepTime的作用,两位都没说错。至于跟多线程如何配合,其实原因是:有sleepTime的时候,还没有多线程呢…
但是如果多个Spider共享线程池,那么在这里sleep不是太合理。考虑改进一下。
这个sleep问题什么时候处理呀?
您的邮件我已收到,祝你天天开心!