💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
思路:把需要爬取的url放入通道,多线程爬取。但是这个快代理有点拉,把我ip拉黑了 ``` package main import ( "fmt" "net/http" "strconv" "time" "github.com/PuerkitoBio/goquery" ) // 使用结构体 来解码 编码json数据 和用来接收爬取的数据 type Presult struct { Ip string `json:"ip"` // ip Port string `json:"port"` // port 端口 Anonymous string `json:"anonymous"` // 匿名度 Agreement string `json:"agreement"` //类型 Region string `json:"region"` //地区 Speed string `json:"speed"` //速度 Timeout string `json:"timeout"` //最后验证时间 } // 采集代理ip数据 func Collection(urljob <-chan string) { for j := range urljob { // 用这个结构体储存 请求返回的结果 proxyList := []Presult{} // 创建一个请求客户端 client := &http.Client{} // 设置发起请求参数 re, err := http.NewRequest("GET", j, nil) // 错误处理 if err != nil { fmt.Println(err) } // 设置请求头 不设置请求头会请求失败 re.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36") // 发起请求 resp, err := client.Do(re) // 错误处理 if err != nil { fmt.Println(err) } // 响应处理 if resp.StatusCode != 200 { fmt.Println("请求失败") } // 使用goquery 的方法 返回网站的html文档 doc, err := goquery.NewDocumentFromReader(resp.Body) //错误处理 if err != nil { fmt.Println(err) } // 根据标签和节点匹配到需要的内容 doc.Find("table tbody tr").Each(func(i int, s *goquery.Selection) { ip := s.Find("td[data-title=IP]").Text() // ip port := s.Find("td[data-title=PORT]").Text() //端口 anonymous := s.Find("td[data-title=匿名度]").Text() //匿名度 agreement := s.Find("td[data-title=类型]").Text() //类型 region := s.Find("td[data-title=位置]").Text() // 位置 speed := s.Find("td[data-title=响应速度]").Text() //响应速度 timeout := s.Find("td[data-title=最后验证时间]").Text() // 最后验证时间 // fmt.Println(ip, port, anonymous, agreement, region, speed, timeout) //检查一下 proxyList = append(proxyList, Presult{ Ip: ip, //ip Port: port, // port 端口 Anonymous: anonymous, // 匿名度 Agreement: agreement, //类型 Region: region, //地区 Speed: speed, //速度 Timeout: timeout, //最后验证时间 }) }) // 输出 这个结构体 fmt.Println(proxyList) time.Sleep(time.Second) } } func main() { // 创建一个通道 urljob := make(chan string, 1000) // 将准备爬取的url 放入通道 for i := 1; i < 10; i++ { urls := "https://www.kuaidaili.com/free/inha/" + strconv.Itoa(i) + "/" urljob <- urls } // 关闭 close(urljob) // 创建2个goroutine for j := 1; j < 5; j++ { go Collection(urljob) time.Sleep(time.Second * 10) } } ```