当前位置: 首页 > 面试题库 >

处理连接错误和JSoup

束研
2023-03-14
问题内容

我正在尝试创建一个应用程序,以从站点的多个页面上抓取内容。我正在使用JSoup进行连接。这是我的代码:

for (String locale : langList){
        sitemapPath = sitemapDomain+"/"+locale+"/"+sitemapName;
        try {
            Document doc = Jsoup.connect(sitemapPath)
                    .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
                    .timeout(10000)
                    .get();

            Elements element = doc.select("loc");   
            for (Element urls : element) {
                System.out.println(urls.text());
                }
        } catch (IOException e) {
            System.out.println(e);
        }
    }

在大多数情况下,一切正常。但是,我想做一些事情。

首先,有时会返回404状态,或者会返回500状态,可能会返回301状态。在下面的代码中,它将仅打印错误并移至下一个URL。我想做的是尝试能够返回所有链接的url状态。如果页面连接,则打印200,否则打印相关的状态码。

其次,有时我会遇到此错误“
java.net.SocketTimeoutException:读取超时”,我可以增加超时时间,但是我希望尝试连接3次,但是第三次​​失败后,我想将URL添加到“失败的”数组中因此我以后可以重试失败的连接。

能比我更多知识的人可以帮助我吗?


问题答案:

对于第一个问题,您可以分两个步骤进行连接/阅读,停止在中间询问状态代码,如下所示:

Connection.Response response = Jsoup.connect(sitemapPath)
                        .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
                        .timeout(10000)
                        .execute();

int statusCode = response.statusCode();
if(statusCode == 200) {
    Document doc = connection.get();
    Elements element = doc.select("loc");   
    for (Element urls : element) {
        System.out.println(urls.text());
    }
}
else {
    System.out.println("received error code : " + statusCode);
}

请注意,如果该execute()方法IOException无法连接到服务器,或者响应的格式错误,例如HTTP等,则该方法将失败,因此您需要进行处理。但是,只要服务器说出了一些有意义的内容,您就可以读取状态码并继续。另外,如果您已要求Jsoup遵循重定向,则不会看到30x响应代码b
/ c Jsoup将从获取的最后一页设置状态代码。

至于第二个问题,您需要做的是围绕我刚刚给您的代码示例循环,并用try /
catch块包装SocketTimeoutException。当您捕获异常时,循环应继续。如果能够获取数据,则返回或中断。喊如果您需要更多帮助!



 类似资料:
  • 请帮助我理解grpc客户端连接错误处理。 我以前用过Micrsoft WCF。如果没有接受以下传入连接的服务,很容易尝试多次连接并放弃: 如果某些IP: port上没有服务侦听,则进行5次连接尝试,然后终止客户端应用程序 这是在客户端和服务同时从VisualStudio调试启动时使用的,所以有时客户端首先启动,它必须等待服务启动。 我曾尝试使用gRPC客户端执行相同的操作,但没有重置from恢复工

  • 问题内容: 当我尝试打开一个链接以使用 jsoup 解析时,出现错误。 连接命令: 引发的错误: 问题答案: 使用(请参阅此处的文档):

  • 我有一个spring webclient对外部服务进行http调用,并得到反应式断路器工厂(resilience4J impl)的支持。当客户端建立连接并响应失败(任何内部服务器或4XX错误)时,WebClient和断路器的行为符合预期。但是,如果客户端无法建立连接,无论是连接被拒绝还是未知主机,它都会开始崩溃。 我似乎无法在webClient中捕获错误消息并触发断路器。 断路器永远不会打开并抛出

  • 我使用以下模块中的反向代理https://github.com/nodejitsu/node-http-proxy 我只需要代理调用到新的端口

  • 输出 错误。jcall(drv@jdrv,“Ljava/sql/Connection;”,“连接”,如图所示。字符(url)[1],:java。lang.NoClassDefFoundError:org/apache/thrift/transport/ttTransportException

  • 在使用mysql连接Eclipse时出现此错误,任何人都可以提供帮助。 不建议在没有服务器身份验证的情况下建立SSL连接。 根据MySQL 5.5.45、5.6.26和5.7.6的要求,如果未设置explicit选项,默认情况下必须建立SSL连接。为了符合不使用SSL的现有应用程序,verifyServerCertificate属性设置为“false”。您需要通过设置显式禁用SSL,或者设置并为服