如果缺少 http://,则使用 url.ResolveReference() 进行错误的 URL 解析

Wrong URL parsing with url.ResolveReference() if http:// is missing

我构建了一个网络爬虫,它可以在网站上搜索该页面上的所有链接,并获取该链接并在其中搜索更多链接,直到爬取整个页面。在我遇到一个特殊站点之前一直运行得很好。

他们的链接有问题:

正常情况1:绝对路径如'http://www.example.com/test'

正常情况 2:相对路径如 '/test'

有问题的新案例:没有 http:// 的绝对路径 - 只是 'www.example.com'

显示问题的示例代码:

package main

import (
    "fmt"
    "log"
    "net/url"
)

func main() {

    u, err := url.Parse("http://www.example.com")
    if err != nil {
        log.Fatal(err)
    }
    base, err := url.Parse("http://example.com/directory/")
        if err != nil {
            log.Fatal(err)
        }

    u2, err := url.Parse("www.example.com")
    if err != nil {
        log.Fatal(err)
    }
    base2, err := url.Parse("http://example.com/directory/")
        if err != nil {
            log.Fatal(err)
        }

    fmt.Println(base.ResolveReference(u))
    fmt.Println(base2.ResolveReference(u2))
}

http://www.example.com
http://example.com/test/www.example.com

如您所见,第二行返回错误的 URL,因为如果缺少 http://,则绝对 URL 的测试是 u.IsAbs() = false ...

有什么解决办法吗?我必须每天测试 100.000 - 1.000.000 个链接,也许更多,并且它需要高性能。

不幸的是,没有真正的 "fix",因为如果你得到一个 link 和这样的 href:

www.example.com

在一般情况下,它是不明确的:

http://host.tld/path/to/www.example.com
http://www.example.com

事实上,大多数浏览器都这样对待 link:

<a href="www.example.com">

像这样:

<a href="/current/path/www.example.com">

我建议您也这样做(因为这是此人网站的错误),如果您收到 404,请像对待其他任何人一样对待它。