【问题标题】:Golang url.Parse always return Invalid Control Character URLGolang url.Parse 总是返回无效的控制字符 URL
【发布时间】:2019-05-02 03:34:19
【问题描述】:

我正在尝试使用从 free-proxy-list.net 获得的代理来抓取一些站点,并使用 Golang 将其应用到我的本地 http 请求中,但是当我使用 url.Parse() 解析代理时总是返回 Invalid控制字符网址

func getProxy() *url.URL {
    proxyUrl := "https://www.proxy-list.download/api/v1/get?type=http&country=US"
    client := &http.Client{}
    req, err := http.NewRequest("GET", proxyUrl, nil)
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error proxy ", err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error response body", err)
    }
    details := string(body)
    temp := strings.Split(details, "\n")
    fmt.Println("http://" + temp[rand.Intn(30)])
    checkProxy, err := url.Parse("http://" + temp[rand.Intn(10)])
    if err != nil {
        fmt.Println("Bad proxy URL", err)
    }

    return checkProxy
}

【问题讨论】:

  • 这意味着 URL 无效。就是这么简单。
  • @Volker,但是当我手动尝试示例“104.129.11.35:3128”时,它可以工作,但是当我尝试从 strings.split 获取值时,它总是返回无效的控制字符 URL

标签: go scrape


【解决方案1】:
proxyUrl := "https://www.proxy-list.download/api/v1/get?type=http&country=US"

此 URL 的内容是格式为 ip:port\r\n´, i.e. the line delimiter is\r\n`(DOS/Windows 样式)的行。

temp := strings.Split(details, "\n")

这将按\n 分割内容,即UNIX 样式的行分隔符。这会将 DOS 行分隔符中的 \r 留在字符串中,从而产生 ip:port\r

...总是返回无效的控制字符 URL

这是它抱怨的那一行中剩余的\r

【讨论】:

    【解决方案2】:

    代理列表中有尾随空格和回车符。 试试

    fmt.Println("http://" + strings.TrimSpace(temp[rand.Intn(30)]))
    checkProxy, err := url.Parse("http://" + strings.TrimSpace(temp[rand.Intn(10)]))
    

    这行得通。

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 2013-12-21
      • 1970-01-01
      • 2019-06-20
      • 2018-07-18
      • 1970-01-01
      • 2018-04-06
      • 2020-08-25
      • 1970-01-01
      相关资源
      最近更新 更多