这是我在这里的第一篇帖子,所以如果我做错了什么,请告诉我。
我在Java 11中编写了几行代码,以便从一个使用JSOUP (1.14.2)的网站上获取信息。由于webstore作为多个页面的数据,所以我使用一个循环来获取我想要的所有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,我不应该第一次访问url,但是我可能错了,因为我对这个领域不太了解。
第二个想法是使用并行流:
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一次只能在连接上使用,循环在第一个连接关闭之前调用新的连接。
感谢您的阅读。
发布于 2021-10-07 14:18:26
下决心
因此,问题似乎在于JDK11和TLSv1.3在JDK中默认启用的协议中的存在。我试着使用JDK 16,现在没有问题了。链接到更深入解释的帖子:Java 11 and 12 SSL sockets fail on a handshake_failure error with TLSv1.3 enabled
https://stackoverflow.com/questions/69270140
复制相似问题