使用Golang Colly爬取亚马逊商品标题被验证码拦截如何解决
Golang Colly爬取亚马逊防验证码拦截解决方案
当前代码未做任何反爬适配,亚马逊反爬机制会识别非浏览器的请求特征,因此大概率触发验证码拦截,以下是Golang生态可直接落地的解决方法:
- 配置标准浏览器请求头:替换Colly默认的User-Agent,新增Accept、Accept-Language、Referer等标准请求头,同时开启Cookie持久化,亚马逊对Cookie有效性校验非常严格。
- 控制请求频率:设置随机请求延迟,降低并发数,避免高频请求触发IP风控。
- 配置代理IP池:单IP请求次数超过阈值必然被封,采集量级较大时必须搭配代理IP池使用,每次请求切换不同IP。
- TLS指纹伪装:Go默认http客户端的TLS指纹特征和真实浏览器差异较大,亚马逊会通过TLS指纹识别爬虫,可使用支持TLS指纹伪装的HTTP库替换Colly底层客户端,模拟Chrome的TLS特征。
- 自动验证码识别:若仍触发验证码,可接入第三方打码平台的Golang SDK,自动识别验证码内容后提交即可。
修正后可运行代码示例
package main import ( "fmt" "math/rand" "strings" "time" "github.com/gocolly/colly" ) // 随机User-Agent池,模拟不同桌面浏览器 var userAgents = []string{ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0", } func main() { rand.Seed(time.Now().UnixNano()) c := colly.NewCollector( colly.AllowedDomains("www.amazon.com", "amazon.com"), // 开启Cookie持久化 colly.CookieJar(nil), ) // 配置请求频率规则 err := c.Limit(&colly.LimitRule{ DomainGlob: "*amazon.*", RandomDelay: 2 * time.Second, // 随机增加0-2秒延迟 Parallelism: 1, // 限制单并发 }) if err != nil { panic(err) } // 请求前自动设置请求头 c.OnRequest(func(r *colly.Request) { r.Headers.Set("User-Agent", userAgents[rand.Intn(len(userAgents))]) r.Headers.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") r.Headers.Set("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2") r.Headers.Set("Referer", "https://www.amazon.com/") r.Headers.Set("Upgrade-Insecure-Requests", "1") }) // 直接匹配商品标题节点,无需遍历所有div提升效率 c.OnHTML("span#productTitle", func(h *colly.HTMLElement) { title := strings.TrimSpace(h.Text) fmt.Println("商品标题:", title) }) // 拦截验证码提示 c.OnHTML("div#captchacharacters", func(h *colly.HTMLElement) { fmt.Println("触发验证码拦截,请接入打码服务完成验证") }) // 按需配置代理,替换为自有代理地址即可 // c.SetProxy("http://代理IP:端口") c.Visit("https://www.amazon.com/Bluetooth-Over-Ear-Headphones-Foldable-Prolonged/dp/B07K5214NZ") }
你提到的程序运行时的英文提示翻译为:
请输入下方你看到的字符。抱歉,我们需要确认你不是机器人。为获得最佳效果,请确保你的浏览器已接受Cookie。
内容的提问来源于stack exchange,提问作者Melisa
相关产品推荐
相关产品推荐

