【问题标题】:Java how to find out if a URL is http or https?Java如何判断一个URL是http还是https?
【发布时间】:2014-03-27 00:05:36
【问题描述】:

我正在用 Java 编写一个网络爬虫工具。当我输入网站名称时,如何在不定义协议的情况下使其以 http 或 https 连接到该网站?

try {
   Jsoup.connect("google.com").get();
} catch (IOException ex) {
   Logger.getLogger(LinkGUI.class.getName()).log(Level.SEVERE, null, ex);
}

但我得到了错误:

java.lang.IllegalArgumentException: Malformed URL: google.com

我能做什么?是否有任何类或库可以做到这一点?

我想要做的是我有一个包含 165 门课程的列表,每门课程都有 65 - 71 个 html 页面,其中包含所有链接。我正在编写一个 Java 程序来测试链接是否损坏。

【问题讨论】:

  • 不,JDK 中没有这样的类,我怀疑任何库都允许这样做。你应该清楚你想要什么。 HTTP 和 HTTPS 非常不同。
  • URL前加前缀http://https://?
  • 我不知道你的用例,但是尝试使用http,应该没问题.. 大多数网站都实现了url重定向。不过我同意上面的评论。
  • 我要做的是我有一个包含 165 门课程的列表,每门课程都有 65 - 71 个 html 页面,其中包含所有链接。我正在编写一个 Java 程序来测试链接是否损坏。

标签: java url jsoup web-crawler


【解决方案1】:

您可以编写自己的简单方法来尝试这两种协议,例如:

static boolean usesHttps(final String urlWithoutProtocol) throws IOException {
    try {
        Jsoup.connect("http://" + urlWithoutProtocol).get();
        return false;
    } catch (final IOException e) {
        Jsoup.connect("https://" + urlWithoutProtocol).get();
        return true;
    }
}

那么,你的原始代码可以是:

try {
    boolean shouldUseHttps = usesHttps("google.com");
} catch (final IOException ex) {
    Logger.getLogger(LinkGUI.class.getName()).log(Level.SEVERE, null, ex);
}

注意:您应该只对每个 URL 使用 usesHttps() 方法一次,以确定要使用的协议。在你知道之后,你应该直接使用 Jsoup.connect() 进行连接。这样会更有效率。

【讨论】:

  • 我不建议每天使用这种方法,因为引发异常是一项代价高昂的操作。最好检测一次访问模式,下次使用检测到的协议连接。
猜你喜欢
  • 2014-08-29
  • 2010-11-27
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2019-02-13
  • 2011-01-04
相关资源
最近更新 更多