1. 程式人生 > >golang爬取免費代理IP

golang爬取免費代理IP

golang爬取免費的代理IP,並驗證代理IP是否可用

這裡選擇爬取西刺的免費代理Ip,並且只爬取了一頁,爬取的時候不設定useAgent西刺不會給你資料,西刺也做反爬蟲處理了,所以小心你的IP被封掉

程式碼:

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "net/http"
    "net/url"
    "strings"
)

var total, useful int = 0, 0
var status = make(chan int)

func main() {

    xcurl :
= "http://www.xicidaili.com/wt/" request, _ := http.NewRequest("GET", xcurl, nil) request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0") cli1 := &http.Client{} response, err := cli1.Do(request) if err != nil { fmt.Println(err) } dom, _ :
= goquery.NewDocumentFromResponse(response) dom.Find("#ip_list tbody tr").Each(func(i int, context *goquery.Selection) { ip := context.Find("td").Eq(1).Text() port := context.Find("td").Eq(2).Text() httpType := context.Find("td").Eq(5).Text() proxyIp := strings.ToLower(httpType) + "
://" + ip + ":" + port // nim := context.Find("td").Eq(4).Text() //是否是高匿,高匿的可以隱藏你的原始IP if ip != "" && port != "" { total++ go checkProxyIP(proxyIp, i) } }) for i := 0; i < total; i++ { <-status } fmt.Println("num=", total, "\nuseful=", useful) fmt.Println("END!") } func checkProxyIP(proxyIp string, i int) { req, _ := http.NewRequest("GET", "http://test.bestbing.cn/", nil) //這裡自己搭個web服務驗證代理是否可用 proxy, _ := url.Parse(proxyIp) cli2 := &http.Client{ Transport: &http.Transport{ Proxy: http.ProxyURL(proxy), }, } resp, _ := cli2.Do(req) if resp != nil && resp.StatusCode == 200 { buf := make([]byte, 1024) n, _ := resp.Body.Read(buf) reStr := string(buf[:n]) if reStr == "Hello World" { //驗證代理有沒有做手腳,可能給你返回一堆廣告 useful++ fmt.Println(proxyIp) } } status <- i }

西刺上的代理IP只有一部分可用,另外高匿IP可用於反爬蟲,但是西刺中有的高匿IP是廣告陷阱,所以獲取代理IP後最好自己搭個伺服器驗證一下,自己的伺服器可以看到請求的原IP,檢查是否匿了