启动爬虫后,在服务器查看日志,总是卡在timeoutException,然后整个进程就block住,不再往下执行:
猜想是浏览器打开网址后,文档正常下载,但是js、css、图片等静态资源没有正常下载,而是一直在加载,导致超时报错,而且没有捕捉这个异常,导致这一个线程死掉。
在downloader的download方法中,
webDriver.get(request.getUrl());
这个打开网页的指令并没有加上超时设置以及超时的异常捕获
,将这一句代码扩展:
//记录开始打开网址的时间
long startTime = System.currentTimeMillis();
try{
//增加最大10s的页面加载时间,在10s内没有报错的话就会报错
webDriver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
//打开网址
webDriver.get(request.getUrl());
}catch(Exception e){
//e.printStackTrace();
logger.info(" can not download page in 10s :" + request.getUrl());
//尝试获取页面,不适用于js加载的页面
try{
WebElement webElement = webDriver.findElement(By.xpath("/html"));
String content = webElement.getAttribute("outerHTML");
if(null!=content&&content.trim()!=""){
logger.info("trying to get html :"+content.trim().length());
Page page = new Page();
page.setRawText(content);
page.setHtml(new Html(content, request.getUrl()));
page.setUrl(new PlainText(webDriver.getCurrentUrl()));
page.setRequest(request);
return page;
}else{
logger.info("trying to get html : null/0");
return null;
}
}catch(Exception ee){
logger.info("trying to get html fail:"+webDriver.getCurrentUrl());
return null;
}finally {
//返回资源
//超时的话则将driver 返回到线程池
webDriverPool.returnToPool(webDriver);
}
}finally {
long endTime = System.currentTimeMillis();
logger.info("download page :"+request.getUrl()+" time:" + (endTime - startTime) + " ");
}