当前位置: 首页 > 知识库问答 >
问题:

使用JSOUP抓取网页时出现SSL错误。这是一个特定于站点的问题吗?(JSOUP在其他网站上工作)

巫马俊力
2023-03-14

使用JSOUP抓取网页时出现SSL错误。这是一个特定于站点的问题吗?(JSOUP在其他网站上工作)

我在试着运行一个刮擦,我一直在运行这样的刮擦,但是这个失败了。通常情况下,我使用jSoup连接到一个网页,然后在页面上抓取我想要的东西。这个人似乎试图做一个ssl握手什么的,但失败了。

我发现这个页面有一个类似的问题,但是,我认为操作是在所有jSoup刮擦,其中我的是特定于这一个网站的问题。https://www.strack.de/de/shop/?idm=1162

我尝试安装最新版本的java并重新启动电脑,但这并没有导致ssl连接成功。我还尝试登录Firefox并下载认证。这似乎与答案中描述的路径不同。

"更多信息"

我认为这个问题可能是由另一个问题引起的,因为刮板在其他网站上工作正常。这就是为什么我把这个问题作为一个单独的问题,而不是对那个问题的评论。

以下是当我试图下载证书时发生的事情。除了显示证书,还有一个视图证书,它没有详细信息选项,也没有导出选项。尝试获取. cert文件,没有提示

我是否做了一些错误的事情,促使我握手,或者这是一种不允许在这个网站上刮擦的功能?我试图从这个网页上删除定价:https://www.strack.de/de/shop/?idm=1162

我使用JSOUP试图刮掉这个页面。它给了我一个错误。当我用谷歌搜索它时,它似乎是人们试图连接到服务器时遇到的错误。

它给了我这个错误:

异常线程"main"javax.net.ssl.SSLHandshake异常:sun.security.validator.验证器异常:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilder异常:无法在sun.security.ssl.找到有效的认证路径请求的目标lerts.getSSLExc0019(A<--PLHD--5/>)在sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)在sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)在sun.security.ssl.Handshaker.fatalSE(andshaker.java:296)在sun.security.ssl.ClientHandshaker.server证书(ClientHandshaker.java:1509)在sun.security.ssl.ClientHandshaker.process消息(ClientHandshaker. java: 216)在sun. security. ssl。Handshaker. ProcLoop(Handshaker. java: 979)at sun. security. ssl。Handshakerprocess_record(Handshaker. java: 914)at sun. security. ssl.SSLSocketImp. readRecords(SSLSocketInp. java: 1062)at sun. security. ssl.在sun. security. ssl的SSLSocketImp. perform初始握手(SSLSocketInp. java: 1375)。启动握手(SSLSocketImp. java: 1403)在sun. security. ssl。SSLSocketImp. start握手(SSLSocketImp. java: 1387)在sun. net. www.协议。http://http://http://http://http://http://http://http://http://http://http://http://www.在sun. net. www.规程. http. net上的Abstract代表HttpsURLConnection. link(Abstract代表HttpsURLConnection. java: 185)。连接(HttpsURLConnectionImp. java: 153)在org. jsoup. helper。在org. jsoup. helper上执行(HttpConnection. java: 732)。在org. jsoup. helper上执行(HttpConnection. java: 707)。在org. jsoup. helper执行(HttpConnection. java: 297)。在scrapetestforstack. de.ScrapeTestForStackDe. main(ScrapeTestForStackDe. java: 81)引起:sun. security. validator.异常:PKIX路径构建失败:sun. security. Supply. certpath。SunCertPathBuilder异常:无法在sun. security. validator上找到请求目标的有效认证路径。PKIXValidator. doBuild(PKIXValidator. java: 387)at sun. security. validator.在sun. security. validator. PKIXValidator. java: 292)上进行工程验证。验证(Validator. java: 260)在sun. security. ssl。验证(X509TrustManagerInp. java: 324)在sun. security. ssl。X509TrustManagerInp. check Trusted(X509TrustManagerInp. java: 229)at sun. security. ssl.X509TrustManagerInp. check ServerTrusted(X509TrustManagerInp. java: 124)at sun. security. ssl.ClientHandshaker. server证书(ClientHandshaker. java: 1491)...15更多原因: sun. security. Supply. certpath。SunCertPathBuilder异常:无法在sun. security. Supply. certpath上找到请求目标的有效认证路径。SunCertPathBuilder. build(SunCertPathBuilder. java: 141)at sun. security. Supply. certpath。工程构建(SunCertPathBuilder. java: 126)在java. security. cert。CertPathBuilder. build(CertPathBuilder. java: 280)at sun. security. validator。21更多C:\用户\LeonardDME\AppData\本地\NetBeans\缓存\8.2\执行器-片段\run. xml: 53: Java返回: 1 BUILD FAILED(总时间: 0秒)

下面是我正在尝试执行的代码

//阶段3刮URL
文档doc=Jsoup.connect(URL). get();

   title = doc.title();
                    
         TitleFixer = title.replaceAll(" ", "");
         title = TitleFixer.replaceAll("|", "");
         TitleFixer = title.replaceAll("|", "");
        title = TitleFixer.replaceAll(";", "");
   
  //Set file writing stuff 1
            GimmeAName = ("C:\\Users\\LeonardDME\\Documents\\NetBeansProjects\\ScrapeTestForStackDe\\Urls\\" + title + ".csv");    
    File f = new File(GimmeAName);
    FileWriter fw = new FileWriter(f);
    PrintWriter out = new PrintWriter(fw);    
            StuffToWrite = URLArray[counter];
            // fetch the document over HTTP               
                 Elements spangrabbers = doc.getElementsByClass("art_orginal_preis142790");
                   for (Element spangrab : spangrabbers)
        {
        //System.out.println("New Span: ");
        //System.out.println(spangrab);
        holder2 = spangrab.text();
        //System.out.println(holder2);
        SpanHolderArray[SpanHolderCounter] = holder2;
        SpanHolderCounter++;
        }
            // get all links in page
            Elements links = doc.select("a[href]");
            for (Element link : links) {
                // get the value from the href attribute
                checker = link.attr("href");
                if (checker.contains("http"))
                {
                }
                else if(checker.contains("javascript"))
                {
                }
                else if(checker.contains("style"))
                {
                }
                else
                {
                    counter++;

                    if(LinkContorter == null && LinkContorter.isEmpty())
                    {
                        //do nothing
                    }
                    else
                    {
                        System.out.println(LinkContorter);
                        out.print(LinkContorter);
                        out.print(",");
                        out.print("\n");
                        //Flush the output to the file
                        out.flush();
                    }
                }
            }
            System.out.println(counter);
        //Close the Print Writer
       out.close();       
       //Close the File Writer
       fw.close();

有没有可能你们中的一些人可以试着刮这个网站,看看你是否得到和我一样的结果?我怀疑可能有一些安全措施来防止刮擦,但是,除非我确定是这样,否则我不想放弃这项任务。几个月前的2月或3月,我也经常刮这个网站,没有问题。

共有2个答案

彭存
2023-03-14

如果您没有发送任何敏感数据,您可以稍微作弊,并配置您自己的TrustManger以接受所有内容。

TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
    }

    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
    }
} };

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

现在它将用于每个连接,因此不推荐使用。相反,您可以注释掉最后一行,并通过如下指定SSLSocketFactory使jsoup仅将其用于单个连接:

// HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); // not needed anymore
Document doc = Jsoup.connect(URL)
                    .sslSocketFactory(sc.getSocketFactory())
                    .get();
翟俊哲
2023-03-14

虽然如Firefox所示,此服务器使用的证书确实使用中间CASectigo RSA Domain ValidationSecure Server CA和root CAUSERTrust RSA CerfiedAuthores进行验证,但服务器仅发送叶子证书,而不是中间链接按标准要求认证。

省略所需的链证书是服务器管理员的一个常见错误,他们不费心阅读留档,因为如果他们只使用一两个浏览器测试,他们不会注意到这个错误——浏览器经常可以绕过丢失的链证书,但大多数其他浏览器软件,包括Java,默认情况下不能或不可以。它不太可能是故意的反刮擦措施,因为它很容易被绕过,请参阅下一步,但它确实表明服务器管理员没有支持或帮助刮擦的实际目标或兴趣。

不要像Krystian建议的那样忽略所有证书问题,你可以通过获取链式证书来解决这个问题——例如,从Firefox导出或获取证书中的caIssuer链接http://crt.sectigo.com/SectigoRSADomainValidationSecureServerCA.crt(显示在SSLLabs报告中,或keytool-printcert解码中,或者如果您将openssl s_客户端输出到openssl x509-noout-text),并将其添加到您的信任库中(默认情况下,文件$JREDIR/lib/security/cacertsjssecacerts,除非您使用sysprop或代码对其进行更改)。

您也可以向站点管理员或所有者报告此问题。他们是否会关心你或非浏览器访问一般我不知道。

 类似资料:
  • 我正在为Java开发人员使用最新的Eclipse IDE中的最新jsoup(1.13.1)(包括孵化组件)版本:2020-09(4.17.0)构建ID:20200910-1200。 我试图解析一个非常具体的网站,但没有成功。在我执行这些行之后:doc=jsoup.connect(“http://pokehb.pw/%d7%a2%d7%95%d7%a0%d7%94/21/%d7%a4%d7%a8%d

  • 我的问题是关于从特定网站上收集数据的可能性。目前,我的算法正在将HTML转换为文本,然后检查文件中包含的标记词,并求和标记的数量。 我的问题在于在刮网站的同时无法向下“滚动”。正如你所看到的,它正在检查一个twitter帐户上的标志数,但它仅限于50sh最新的tweets。我希望我说清楚了。 附注:我给了twitter一个例子,我不是在为twitter寻找特定的东西,而是更健壮的东西。 我将非常感

  • 完全新的Java和J汤。我试图创建一个简单的程序,刮网络,给我Java股市的数据。我想从道琼斯股票开始,让它打印出52周的区间数据。它转到http://finance.yahoo.com/quote/AAPL?ltr=1,查看左下表(从上一次收盘价开始),然后下到第5个索引,从那里获取文本值。我得到的错误: 线程“main”组织中出现异常。jsoup。选择选择器$SelectorParseExce

  • 问题内容: 在此网站上,您可以输入您的学生卡号,然后显示该卡上还剩多少钱。我想使用JSOUP获得信息。这是我当前的代码,但是不起作用, 我没有太多经验,所以我不知道在哪里寻找问题。一些想法: 我应该使用还是? 在使用chrome devoloper工具时,发布数据是我使用功能发送的所有数据。但是,如果发送时出现错误,为什么? 我应该发送解密或加密的数据吗?(两者均在chrome devoloper

  • 问题内容: 使用Jsoup登录网站需要什么?我相信我的代码是正确的,但是我从未使用Jsoup成功登录到网站,因此我可能会丢失一些东西。这是我的代码: 返回一个显示未成功登录的登录页面。有一个名为的输入值,我认为这可能是为什么它不起作用的原因。这个值会随着时间的推移而上升。我运行了两次代码,时间变量返回了和。我的代码需要大约10秒钟的时间来打印文档,因此,变量在发送发布请求时是否已经更改?我不确定这

  • 尝试使用Jsoup而不是网站API从网站上练习和获取信息。我的代码没有错误,但文本字段没有更改。它只是给我一个空白。我如何从网站上获取信息?我正试图获取主要新闻,以便在我的网站上发布。 我的代码: