gathertool
轻量级爬虫,接口测试,压力测试框架, 提高开发对应场景的golang程序的效率。
点击开始
文档:开始使用
go get github.com/mangenotwork/gathertool
简单的get请求
import gt "github.com/mangenotwork/gathertool"
func main(){
ctx, err := gt.Get("https://www.baidu.com")
if err != nil {
log.Println(err)
}
log.Println(ctx.RespBodyString)
}
含请求事件请求
import gt "github.com/mangenotwork/gathertool"
func main(){
gt.NewGet(`http://192.168.0.1`).SetStartFunc(func(ctx *gt.Context){
log.Println("请求前: 添加代理等等操作")
ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
}
).SetSucceedFunc(func(ctx *gt.Context){
log.Println("请求成功: 处理数据或存储等等")
log.Println(ctx.RespBodyString())
}
).SetFailedFunc(func(ctx *gt.Context){
log.Println("请求失败: 记录失败等等")
log.Println(ctx.Err)
}
).SetRetryFunc(func(ctx *gt.Context){
log.Println("请求重试: 更换代理或添加等待时间等等")
ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
}
).SetEndFunc(func(ctx *gt.Context){
log.Println("请求结束: 记录结束,处理数据等等")
log.Println(ctx)
}
).Do()
}
事件方法复用
func main(){
gt.NewGet(`http://192.168.0.1`).SetSucceedFunc(succeed).SetFailedFunc(failed).SetRetryFunc(retry).Do()
gt.NewGet(`http://www.baidu.com`).SetSucceedFunc(baiduSucceed).SetFailedFunc(failed).SetRetryFunc(retry).Do()
}
// 请求成功: 处理数据或存储等等
func succeed(ctx *gt.Context){
log.Println(ctx.RespBodyString())
}
// 请求失败: 记录失败等等
func failed(ctx *gt.Context){
log.Println(ctx.Err)
}
// 请求重试: 更换代理或添加等待时间等等
func retry(ctx *gt.Context){
ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
}
// 百度请求成功后
func baiduSucceed(ctx *gt.Context){
log.Println(ctx.RespBodyString())
}
post请求
// FormData
postData := gt.FormData{
"aa":"aa",
}
// header
header := gt.NewHeader(map[string]string{
"Accept":"*/*",
"X-MicrosoftAjax":"Delta=true",
"Accept-Encoding":"gzip, deflate",
"XMLHttpRequest":"XMLHttpRequest",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
})
// cookie
cookie := gt.Cookie{
"aa":"a"
}
// 随机休眠 2~6秒
sleep := gt.SetSleep(2,6)
c := gt.NewPostForm(caseUrl, postData, header, cookie, sleep)
c.Do()
html := c.RespBodyString()
log.Print(html)
数据存储到mysql
var (
host = "192.168.0.100"
port = 3306
user = "root"
password = "root123"
dbName = "dbName"
db,_ = gt.NewMysql(host, port, user, password, dbName)
)
//.... 执行抓取
data1 := "data1"
data2 := "data2"
inputdata := map[string]interface{} {
"data1" : data1,
"data2" : data2,
}
tableName := "data"
db.Spider2022DB.InsertAt(tableName, inputdata)
更多方法见 文档
实例
常见的反爬虫策略
- User-Agent反爬
- IP访问频率限制
- 强制登录
- 漏桶、令牌桶之类的算法限制接口访问频率
- 数据接口加上庞大的加密解密和混淆算法
- JS代码执行后,会发送一个带参数key的请求,后台通过判断key的值来决定是响应真实的页面,还是响应伪造或错误的页面。因为key参数是动态生成的,每次都不一样,难以分析出其生成方法,使得无法构造对应的http请求
TODO
- 分布式
- tcp测试
- udp测试
- 设置延迟时间, 随机延迟时间 [v0.3.2]
// SetSleep 设置延迟时间
func (c *Context) SetSleep(i int) *Context
// SetSleepRand 设置延迟随机时间
func (c *Context) SetSleepRand(min, max int) *Context
- 开发文档: 版本说明,更新说明
- HTTP代理抓包
- HTTPs代理抓包