zoukankan      html  css  js  c++  java
  • 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, "
    useful=", 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,检查是否匿了

     
  • 相关阅读:
    Div+Css布局教程(-)CSS必备知识
    html表格设置
    wxAui Frame Management用法
    aui
    MySQL死锁
    InnoDB索引存储结构
    MySQL事务调优
    MySQL慢SQL语句常见诱因
    InnoDB的LRU淘汰策略
    InnoDB事务之redo log工作原理
  • 原文地址:https://www.cnblogs.com/xbblogs/p/10082114.html
Copyright © 2011-2022 走看看