忽略go web爬虫中的外部链接

忽略go web爬虫中的外部链接,go,web-crawler,url-parsing,Go,Web Crawler,Url Parsing,我真的是新手,现在我正在玩它,按照本教程构建一个简单的网络爬虫: 它被很好地分解了,但是我想把一些东西放在适当的位置,这样排队的链接就只是主域的一部分,而不是外部的 假设我在爬行,我只想包含像或这样的东西-我不想要子域,比如或外部链接,因为我不希望爬行器掉进黑洞 查看代码,我认为我需要对该函数进行更改,以修复相关链接: func fixUrl(href, base string) (string) { // given a relative link and the page on uri

我真的是新手,现在我正在玩它,按照本教程构建一个简单的网络爬虫:

它被很好地分解了,但是我想把一些东西放在适当的位置,这样排队的链接就只是主域的一部分,而不是外部的

假设我在爬行,我只想包含像或这样的东西-我不想要子域,比如或外部链接,因为我不希望爬行器掉进黑洞

查看代码,我认为我需要对该函数进行更改,以修复相关链接:

func fixUrl(href, base string) (string) {  // given a relative link and the page on
  uri, err := url.Parse(href)              // which it's found we can parse them
  if err != nil {                          // both and use the url package's
    return ""                              // ResolveReference function to figure
  }                                        // out where the link really points.
  baseUrl, err := url.Parse(base)          // If it's not a relative link this
  if err != nil {                          // is a no-op.
    return ""
  }
  uri = baseUrl.ResolveReference(uri)
  return uri.String()                      // We work with parsed url objects in this
}                                          // func but we return a plain string.
然而,我不是100%确定如何做到这一点,我假设需要某种if/else或进一步的解析


对于我的学习,任何提示都将不胜感激

我快速阅读了jdanger教程并运行了完整的示例。毫无疑问,有几种方法可以完成你想做的事情,但我的看法是

基本上,您希望将域与指定域不匹配的任何URL排队,可能是作为命令行参数提供的。该示例使用
fixUrl()
函数来构造完整的绝对URL,并发出无效URL的信号(通过返回
“”
)。在这个函数中,它依赖于
net/url
包进行解析等等,特别是依赖于
URL
是一个具有以下定义的
struct

键入URL结构{
方案字符串
不透明字符串//编码的不透明数据
用户*用户信息//用户名和密码信息
主机字符串//主机或主机:端口
路径字符串//路径(相对路径可以省略前导斜杠)
RawPath字符串//编码路径提示(参见EscapedPath方法);在Go 1.5中添加
ForceQuery bool//即使RawQuery为空也附加查询(“?”);添加到Go 1.7中
RawQuery字符串//编码的查询值,不带“?”
片段字符串//引用片段,不带“#”
RawFragment string//编码的片段提示(请参见EscapedFragment方法);在Go 1.15中添加
}
需要注意的是
主机
Host
是URL的“whatever.com”部分,包括子域和端口(请参阅)。进一步阅读文档,有一个方法
Hostname()
,它将剥离端口(如果存在)

因此,尽管您可以将域过滤添加到
fixUrl()
,但我认为更好的设计是先“修复”URL,然后对结果进行添加检查,以查看其
主机
与所需域匹配。如果该URL不匹配,请不要将其排入队列,并继续进入队列中的下一项

所以,基本上我认为你走在正确的轨道上。我没有包含一个代码示例来鼓励您自己解决这个问题,尽管我确实将您的功能添加到了教程程序的本地副本中