Java 11 JSOUP SSLHandshakeException

Posted

技术标签:

【中文标题】Java 11 JSOUP SSLHandshakeException【英文标题】: 【发布时间】:2021-11-15 02:08:42 【问题描述】:

这是我在这里的第一篇文章,所以如果我做错了什么,请随时告诉我。

我在Java 11 中编写了几行代码,以便通过JSOUP (1.14.2) 从网上商店获取信息。由于网络商店是多页数据,因此我使用循环来获取我想要的所有 url。

这是我正在做的一个简化示例:

for (int i = 1; i < 36; i++) 
    String url = ("https://www.play-in.com/rachat/hotlist/magic?p=" + i);

    try 
        doc = Jsoup.connect(url).get();
     catch (Exception e) 
        logger.info("Impossible de récuppérer les éléments de la page " + i + " : " + e);
    

    //  here i'm parsing the html to return an array of object

当我运行程序时,我得到:

[main] INFO  service.MagicBazarReader  -  Failed to get data from page 2 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 3 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 4 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 5 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 6 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[...]
[main] INFO  ISmellProfits  - Number of result after HTML parsing : 24

等等。 所以第一个 get() 总是成功的,我可以操纵结果,但是在调用 multipe Jsoup.connect() 时似乎有问题。

由于我正在调用HTTPS url,我首先想到的是证书问题,我尝试了这个解决方案How to connect via HTTPS using Jsoup?,但它没有帮助。如果真的需要certificate,我不应该第一次访问该网址,但我在这里可能错了,因为我对这个域知之甚少。

第二个想法是使用并行流

List <String> links = new ArrayList<>();
for (int i = 1; i < 36; i++) 
    String url = ("https://www.play-in.com/rachat/hotlist/magic?p=" + i);
    links.add(url);


links.parallelStream().forEach(link - > 
    Document doc = new Document("");
    try 
        doc = Jsoup.connect(link).get();

        // here i'm parsing the HTML to return an array of object 
     catch (Exception e) 
        logger.info("Impossible de récuppérer les éléments de la page " + link.substring(link.length() - 2) + " : " + e);
    
);

我有更好的结果,但仍然不完美:

[ForkJoinPool.commonPool-worker-17] INFO  service.MagicBazarReader  - Failed to get data from page 12 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-23] INFO  service.MagicBazarReader  -  Failed to get data from page 30 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-9] INFO  service.MagicBazarReader  -  Failed to get data from page 5 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-27] INFO  service.MagicBazarReader  -  Failed to get data from page 35 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[main] INFO  service.MagicBazarReader  -  Failed to get data from page 22 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-3] INFO  service.MagicBazarReader  -  Failed to get data from page 1 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-7] INFO  service.MagicBazarReader  -  Failed to get data from page 2 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-21] INFO  service.MagicBazarReader  -  Failed to get data from page 17 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[ForkJoinPool.commonPool-worker-5] INFO  service.MagicBazarReader  -  Failed to get data from page 31 : javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure  
[...]
[main] INFO  ISmellProfits  - Number of result after HTML parsing : 286

所以我在HTML 解析后得到了更多的结果,但它们并不一致,因为我每次运行都有不同的数字而且我仍然得到SSLHandshakeException

我想不通,所以我想问是否有人知道是什么导致抛出异常。 我对使用 JSOUP 很陌生,所以我仍然不太了解。 我认为可能是 JSOUP 一次只能有一个连接,循环在第一个关闭之前调用新的。

感谢阅读。

【问题讨论】:

您应该在每次循环结束后关闭连接。也许您的网站不允许每个客户端超过 1 个连接。 我只是在本地运行你的代码,我可以成功获取所有 35 页。可能是您的互联网连接不稳定吗?您确定异常是由您共享的代码引发的吗?或者“我在这里解析 HTML 以返回对象数组”部分是罪魁祸首吗? @Pilpo Jsoup 在请求完成后自行关闭连接。 @Pilpo - 仅供参考:“您应该在每次循环结束后关闭连接”。当您调用 get() 或 execute() 时,Jsoup 会自行管理连接。没有什么可以关闭的。 connect() 方法只是准备一个请求,它实际上并没有进行任何网络 IO 或有任何泄漏。 看来问题出在我的电脑上,我在笔记本电脑上运行了一次,没有任何问题。我会查看我的防病毒软件是否没有阻止我的连接。 【参考方案1】:

[已解决]

因此,问题似乎出在 JDK11 以及 JDK 中默认启用的协议中存在 TLSv1.3。我尝试使用 JDK 16 并且我不再有问题了。 更深入解释的帖子的链接:Java 11 and 12 SSL sockets fail on a handshake_failure error with TLSv1.3 enabled

【讨论】:

以上是关于Java 11 JSOUP SSLHandshakeException的主要内容,如果未能解决你的问题,请参考以下文章

Java使用Jsoup获得新闻联播所有文字稿

Jsoup Java HTML 解析器:执行 Javascript 事件

如何使用 Jsoup 通过 HTTPS 连接?

Jsoup错误java.lang.NoClassDefFoundError: org.jsoup.Jsoup

Atitit.html解析器的选型&#160;jsoup&#160;nsoup&#160;,java&#160;c#&#160;.net&#160;版本

Java 实现 HttpClients+jsoup,Jsoup,htmlunit,Headless Chrome 爬虫抓取数据