问题
按照慕课网老师撸代码发现单机版爬虫爬取珍爱网会出现403,202等问题,现提供简单的解决方案。
1. wrong status code:403
主要原因是服务器检测到没有User-Agent的头部,需要在代码里添加User-Agent,可以从Chrome的调试信息中复制,或者Postman等接口调试工具中也有。
比如
req, err := http.NewRequest("GET", newUrl, nil)
if err != nil {
panic(err)
return nil, err
}
// req.Header.Set("User-Agent", "PostmanRuntime/7.26.1")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36")
2. wrong status code:202
主要原因是服务器反爬虫机制导致,简单来说就是发给服务器的请求cookie验证不通过。完全解决稍微复杂,若想简单通过调试可采用如下方法:
- 将得到的url中的http转成https
newUrl := strings.Replace(url, "http://", "https://", 1)
- 去浏览器的请求中找一个cookie(只有1分钟有效期哦)
cookie1 := "xxx"// 上图找到的cookie
req.Header.Add("cookie", cookie1)
不用引额外的包即可简单解决。
完整代码片段
将其替换fetcher部分可临时解决供调试用,不影响代码理解(老师讲的很好~)
client := &http.Client{}
newUrl := strings.Replace(url, "http://", "https://", 1)
req, err := http.NewRequest("GET", newUrl, nil)
if err != nil {
panic(err)
return nil, err
}
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36") User-agent
cookie1 := "xxx"
req.Header.Add("cookie", cookie1)
resp, err := client.Do(req)
if err != nil {
log.Fatalln(err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("wrong status code: %d", resp.StatusCode)
}