近日在生产环境中遇到个奇怪的问题,通过curl访问服务可以获取正常的http应答,通过代码访问则返回403。经过一番排查测试,最终发现问题在于通过代码访问服务时,使用默认的用户代理被拦截了。
什么是用户代理?
用户代理简称 UA(User Agents),是Http协议中的一部分,属于标头的组成部分,指的是促进用户与网页内容交互时的任何软件,它是一个特殊字符串头,使得目标服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。在网络请求当中,用户代理是标明身份的一种标识,通过这个标识,用户所访问的网站使用此信息来调整对设备、操作系统和浏览器类型的响应从而为用户提供更好的体验或者进行信息统计。
为什么会被拦截?
有些目标网站明确表示不允许机器人爬虫或爬取工具,所以,一旦其将某些用户代理来源标识为机器人,就会阻止爬取;有些防范更严密的网站会以相反的方式执行此操作:它们只允许他们认为有效的用户代理执行爬取作业;防范最高级的网站会检查浏览器在其网页上的“行为”:是否与其声称的用户代理相匹配。您可能认为正确的解决方案是不在请求中设置用户代理。 但是,这会导致爬取工具使用默认用户代理,大多数情况下,目标网页服务器会将其列入黑名单并加以阻止。
如何避免被拦截
在代码里加上req.Header.Set("User-Agent", "test")。