jsoup.parse 的一个坑

时间:2022-05-28 09:05:02

那天,写好一个爬虫 爬取某个网站的数据。 当时调用了公司不知道某个人写的 一个方法

logger.info(joururl);

doc= util.getDocument(joururl.toString());

//这里通过url 去得到 网页

本地调试 通过以后 就放到服务器上跑了。

跑着跑着就卡住。 也不报错。 也不停。

当时 以为是内存满了。找了很多方法。 能不重复new的对象坚决不重复new  定义java虚拟机内存 等

还是卡住

后来点进这个方法看才发现问题

这个方法 是这样的

    public static Document getDocument(String Url) {
try {
return Jsoup.connect(Url).userAgent(USER_AGENT).timeout(TIMEOUT).get();
} catch (IOException e) {
return null;
}
}

这里 有什么问题呢。  当网络波动的时候,或者别的原因, 没有拿到网页。 此时。 他catch了。 可是 不抛异常。 那么 程序不会停下来, 不会报错,线程会直接阻塞住。

这就是卡的原因。

所以 应该改进为

Connection.Response response = null;
for(int i=;i<=;i++){
response = Jsoup.connect(Url).userAgent(USER_AGENT).timeout(TIMEOUT).execute();
int statusCode = response.statusCode();
if(statusCode!=){
log.info("get page error to"+i+"connect");
}
else{
return response.parse();
}
}

即,当页面异常的时候  再连一次。 重复3次,假如3次都不成功,那么 抛异常 return null

也就 是说。  这个 statusCode的判断是很重要的。

记住这个小坑。抛异常是非常重要的呀。 让我知道是哪个写的,我~~~~~~~~~