模拟登录
CookieJarhttp.Client
// &cookiejar.Options{PublicSuffixList: publicsuffix.List},这是为了可以根据域名安全地设置cookies
cookieJar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
if err != nil {
   panic(err)
}
client = http.Client{Jar: cookieJar, Timeout: time.Second * 3}
POST提交
io.Readerbodya=b&c=durl.Valuesmap[string][]stringSetAdd
params := url.Values{}
// 添加参数
params.Add("memberAccount", "xxx")
// 添加sha1后的参数
params.Add("memberUmm", fmt.Sprintf("%x", sha1.Sum([]byte("xxxx"))))
params.Add("check", captcha)
params.Add("rememberMe", "on")
// 1.必须设置正确的Content-Type,否则服务器无法正确识别参数
// 2.params.Encode()生成查询字符串,然后用string.NewReader包裹这个字符串使其可读
res, err := client.Post("https://www.example.com/login.json", "application/x-www-form-urlencoded", strings.NewReader(params.Encode()))
if err != nil {
   return "", err
}
// 记得关闭
defer res.Body.Close()
上传文件
multipart.Writermultipart.NewWriterio.Writerbodybodybytes.Buffer
body := new(bytes.Buffer)
// 创建body的写入器
mulWriter := multipart.NewWriter(body)

写入普通字段

// 直接调用writeField方法即可,参数1是参数名,参数2是参数值
err := mulWriter.WriteField("user_name", "xxx")
if err != nil {
    return "", err
}

写入文件字段

CreateFormFile
// 创建文件写入器,并指明文件参数名和参数值
fileWriter, err := mulWriter.CreateFormFile("upload", filepath.Base(filename))
if err != nil {
    return "", err
}
// 打开需要上传的文件
file, err := os.Open(filename)
if err != nil {
    return "", err
}
defer file.Close()
// 复制文件内容到写入器
_, err = io.Copy(fileWriter, file)
if err != nil {
    return "", err
}
// 记得关闭,让缓冲区的内容写入body中
err = mulWriter.Close()
if err != nil {
   return "", err
}
res, err := client.Post("http://v1-http-api.jsdama.com/api.php?mod=php&act=upload", mulWriter.FormDataContentType(), body)
FormDataContentType()multipart/form-databoundaryboundary

使用 Golang 写爬虫经验总结

使用Fiddler调试程序

使用Fiddler抓包可以让我们方便的看到程序提交到服务器的数据格式,使得调试和修改程序更加简单。Fiddler相当于一个正向代理服务器,启动后,它会把IE的代理服务器设置为http://127.0.0.1:8888 ,即Fiddler默认的代理地址,这样所有浏览器的请求都会先通过Fiddler,再由Fiddler转发出去,实现抓包。
但是上面的机制只对系统的浏览器有效,要对其他程序也生效,需要单独的设置程序的代理。
Golang设置代理比较简单,只需要增加一个环境变量设置即可,可以修改系统的环境变量,也可以通过代码动态添加。

// 设置httpClient的代理
os.Setenv("HTTP_PROXY", "http://127.0.0.1:8888")

解决HTTPS解密失败的问题

如果Fiddler出现无法解密HTTPS请求,看不到原始请求数据的情况,可以尝试重新安装Fiddler的根证书来解决。具体操作:

  1. 打开Fiddler,依次点击菜单Tools->Options,打开设置对话框,点击选中"HTTPS"面板

使用 Golang 写爬虫经验总结

  1. 取消“Decrypt HTTPS traffic”的选中状态,点击“Actions”按钮,点击“Reset All Certificates”,之后会弹出确认框问你是否要删除当前的证书并创建新的证书,一路允许即可

使用 Golang 写爬虫经验总结