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的主要内容,如果未能解决你的问题,请参考以下文章
Jsoup Java HTML 解析器:执行 Javascript 事件
Jsoup错误java.lang.NoClassDefFoundError: org.jsoup.Jsoup
Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本
Java 实现 HttpClients+jsoup,Jsoup,htmlunit,Headless Chrome 爬虫抓取数据