gospider 介绍
gospider 是一个golang 爬虫神器,它内置了多种反爬虫模块,是golang 爬虫必备的工具包
安装
go get -u gitee.com/baixudong/gospider
gitee地址
https://gitee.com/baixudong/gospider
github地址
https://github.com/baixudong007/gospider
代理介绍:支持http,socks5代理
gospider 中请求设置代理有两种模式:自实现模式,官方代理模式
自实现模式介绍: 自实现代理主要解决官方代理模式的几大问题:
- net/http 对ja3进行伪装时无法使用官方代理模式
- net/http 使用http2.Transport时无法使用官方代理模式
- 官方代理模式先连接代理,再从连接池中获取连接,而自实现代理是先获取连接后连接代理,这样可以最大程度的服用代理连接,避免代理的频繁连接,从而提高爬虫速度
- 自实现代理完全契合context,而官方代理模式在连接代理时无法完全和context的生命周期保持一致
- 自实现代理可以在使用同时使用ja3伪装和http2的情况下使用代理,而官方代理模式则不行
全局代理设置,固定代理(全局代理使用的是自实现代理)
package main
import (
"context"
"log"
"gitee.com/baixudong/gospider/requests"
)
func main() {
reqCli, err := requests.NewClient(context.TODO(), requests.ClientOption{Proxy: "http://192.168.1.30:7005"})
if err != nil {
log.Panic(err)
}
response, err := reqCli.Request(context.TODO(), "get", "http://myip.top")
if err != nil {
log.Panic(err)
}
log.Print(response.Text())
}
全局代理设置,按照规则返回代理(全局代理使用的是自实现代理)
package main
import (
"context"
"log"
"net/url"
"gitee.com/baixudong/gospider/requests"
)
func main() {
reqCli, err := requests.NewClient(context.TODO(), requests.ClientOption{
GetProxy: func(ctx context.Context, url *url.URL) (string, error) {
return "socks5://192.168.1.30:7005", nil
},
})
if err != nil {
log.Panic(err)
}
response, err := reqCli.Request(context.TODO(), "get", "http://myip.top")
if err != nil {
log.Panic(err)
}
log.Print(response.Text())
}
官方代理模式介绍:当处于以下情况下强制使用自实现代理:
- net/http 对ja3进行伪装时无法使用官方代理模式
- net/http 使用http2.Transport时无法使用官方代理模式
- 自实现代理可以在使用同时使用ja3伪装和http2的情况下使用代理,而官方代理模式则不行
局部代理设置(局部代理使用的是官方代理模式,局部代理强制覆盖全局代理)
package main
import (
"context"
"log"
"gitee.com/baixudong/gospider/requests"
)
func main() {
reqCli, err := requests.NewClient(context.TODO())
if err != nil {
log.Panic(err)
}
response, err := reqCli.Request(context.TODO(), "get", "http://myip.top", requests.RequestOption{Proxy: "http://192.168.1.30:7005"})
if err != nil {
log.Panic(err)
}
log.Print(response.Text())
}
如何对个别请求强制关闭代理
package main
import (
"context"
"log"
"gitee.com/baixudong/gospider/requests"
)
func main() {
reqCli, err := requests.NewClient(context.TODO(), requests.ClientOption{Proxy: "socks5://192.168.1.30:7005"})
if err != nil {
log.Panic(err)
}
response, err := reqCli.Request(context.TODO(), "get", "http://myip.top", requests.RequestOption{DisProxy: true})
if err != nil {
log.Panic(err)
}
log.Print(response.Text())
}