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

时间:2019-05-02 03:34:19

标签: go scrape

我正在尝试使用从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
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

这有效。