使用Go语言Colly框架爬取福布斯实时富豪榜返回fallback页求助
福布斯反爬拦截解决方法
出现兜底页面的核心原因是福布斯平台有严格的爬虫识别规则,默认Colly的请求特征过于明显会被直接拦截。URL末尾的哈希属于前端路由标识,服务端不会接收处理,重复请求失败是请求特征被标记导致,和哈希参数无关。
具体修复步骤
- 补全真实浏览器的请求头,替换Colly默认的爬虫标识UA,添加Accept、Accept-Language等常规请求头,避免被特征匹配直接拦截
- 启用Collector的Cookie存储,保留会话标识,避免每次请求被判定为异常新访问
- 添加请求间隔限制,降低访问频率,避免触发站点的频率控制规则
- 确保请求的域名和AllowedDomains规则匹配,建议直接访问带www前缀的完整地址,避免301跳转过程中丢失请求参数
修改后可运行代码
package main import ( "encoding/csv" "fmt" "net/http/cookiejar" "os" "time" "github.com/gocolly/colly" ) func checkError(err error) { if err != nil { panic(err) } } func main() { fName := "data.csv" file, err := os.Create(fName) checkError(err) defer file.Close() writer := csv.NewWriter(file) defer writer.Flush() // 初始化时启用CookieJar jar, _ := cookiejar.New(nil) c := colly.NewCollector( colly.AllowedDomains("forbes.com", "www.forbes.com"), colly.CookieJar(jar), ) // 设置模拟浏览器的UA c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" // 设置请求头 c.OnRequest(func(r *colly.Request) { r.Headers.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8") r.Headers.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") r.Headers.Set("Upgrade-Insecure-Requests", "1") fmt.Println("Visiting", r.URL) }) // 添加访问频率限制 err = c.Limit(&colly.LimitRule{ DomainGlob: "*forbes.com", Delay: 1 * time.Second, RandomDelay: 2 * time.Second, }) checkError(err) // 注意这里的选择器如果拿不到数据,可打开浏览器控制台确认最新的节点类名,前端会迭代更新 c.OnHTML(".scrolly-table tbody tr", func(e *colly.HTMLElement) { writer.Write([]string{ e.ChildText(".rank .ng-binding"), }) }) c.OnError(func(_ *colly.Response, err error) { fmt.Println("Something went wrong:", err) }) c.OnResponse(func(r *colly.Response) { fmt.Println("响应状态码:", r.StatusCode) }) // 访问带www的完整地址 c.Visit("https://www.forbes.com/real-time-billionaires/") }
如果修改后仍然返回校验页面,可以通过本地搭建无头浏览器的方式绕过更复杂的JS反爬校验。
内容的提问来源于stack exchange,提问作者Rahul R Nair
相关产品推荐
相关产品推荐

