如果缺少 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,请像对待其他任何人一样对待它。
我构建了一个网络爬虫,它可以在网站上搜索该页面上的所有链接,并获取该链接并在其中搜索更多链接,直到爬取整个页面。在我遇到一个特殊站点之前一直运行得很好。
他们的链接有问题:
正常情况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,请像对待其他任何人一样对待它。