jsoup.parse 的一个坑

时间:2022-10-31 11:53:14

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

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=1;i<=3;i++){
     response = Jsoup.connect(Url).userAgent(USER_AGENT).timeout(TIMEOUT).execute();
     int statusCode = response.statusCode();
     if(statusCode!=200){
         log.info("get page error  to"+i+"connect");
     }
     else{
        return response.parse();
     }
    }

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

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

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