1. UA 是什么
- User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
简单来说,就是指谁来代替我们访问网页的,获取客户端信息。 - UA的作用一般是用来反爬虫,一般用python写的爬虫程序,UA是有带 ‘python-requests’ 的,有些服务器就会根据UA设置反爬措施
2. UA在各个浏览器的参数
-
各个浏览器的navigator.userAgent
IE11: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Chrome: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4077.0 Safari/537.36 Firefox: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:68.0) Gecko/20100101 Firefox/68.0 Safari: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15 edge: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063 Opera: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.100
-
各个浏览器的正则匹配
rwebkit = /(webkit)[ \/]([\w.]+)/,//webkit ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,//opera rmsie = /(msie) ([\w.]+)/,//ie rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,//mozilla 通过userAgent,我们可以看到chrome可以通过以下方式匹配到,但是因为和safari一样,都带有“safari”,我们可以把它放在rwebkit.前进行匹配 rchrome=/(Chrome)[ \/]([\w.]+)/ 同样firefox也可以这么做,把它放在rmozilla前面进行判断 rfirefox=/(Firefox)[ \/]([\w.]+)/
3. User-Agent字段解释
chrom浏览器
Mac: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4077.0 Safari/537.36
Win10: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
User-Agent通常格式:
Mozilla/5.0 (平台) 引擎版本 浏览器版本号
-
第一部分:Mozilla/5.0
由于历史上的浏览器大战,当时想获得图文并茂的网页,就必须宣称自己是 Mozilla 浏览器。此事导致如今User-Agent里通常都带有Mozilla字样,Mozilla/x.0 的意思是,兼容Mozilla渲染引擎。出于对历史的尊重,大家都会默认填写该部分。 -
第二部分:平台这部分可由多个字符串组成,用英文半角分号分开
如果是MAC,那么就是Mac OS X ,系统版本是10.13.6。
如果是Win10,那么就是Windows NT 10.0,Win64; x64是指操作系统是64位的。Windows系统下: Windows NT 5.0 // 如 Windows 2000 Windows NT 5.1 // 如 Windows XP Windows NT 6.0 // 如 Windows Vista Windows NT 6.1 // 如 Windows 7 Windows NT 6.2 // 如 Windows 8 Windows NT 6.3 // 如 Windows 8.1 Windows NT 10.0 // 如 Windows 10 Win64; x64 // Win64 on x64 WOW64 // Win32 on x64 Linux系统下: X11; Linux i686; // Linux 桌面,i686 版本 X11; Linux x86_64; // Linux 桌面,x86_64 版本 X11; Linux i686 on x86_64 // Linux 桌面,运行在 x86_64 的 i686 版本 macOS系统下: Macintosh; Intel Mac OS X 10_9_0 // Intel x86 或者 x86_64 Macintosh; PPC Mac OS X 10_9_0 // PowerPC Macintosh; Intel Mac OS X 10.12; // 不用下划线,用点
-
第三部分:引擎版本
AppleWebKit/537.36 (KHTML, like Gecko)…Safari/537.36,历史上,苹果依靠了WebKit内核开发出Safari浏览器,WebKit包含了WebCore引擎,而WebCore又从KHTML衍生而来。由于历史原因,KHTML引擎需要声明自己是“类似Gecko”的,因此引擎部分这么写。再后来,Google开发Chrome也是用了WebKit内核,于是也跟着这么写。借用Littern的一句话:“Chrome 希望能得到为Safari编写的网页,于是决定装成Safari,Safari使用了WebKit渲染引擎,而WebKit呢又伪装自己是KHTML,KHTML呢又是伪装成Gecko的。同时所有的浏览器又都宣称自己是Mozilla。”。不过,后来Chrome 28某个版本改用了blink内核,但还是保留了这些字符串。而且,最近的几十个版本中,这部分已经固定,没再变过。
简单来说,就是在浏览器开发过程了,为了保证浏览器的效果,需要假装成是其他的浏览器,这样一直相互引用,所以才导致现在的引用字符串这么长, -
浏览器版本
以Mac 的Chrome浏览器为例,其中82.0 是大版本,4077是持续增大的一个数字,而0则是修补漏洞的小版本。
4. 请求头(request header)内容
- 浏览器自动生成的请求。如果是通过浏览器发送的请求,那么以下这些消息头只能由浏览器控制,而不能用XMLHttpRequest对象来修改,即不能通过JavaScript修改。这个是w3c建议的标准。
- 浏览器插件,javascript脚本增加或者修改的header。JS能够控制浏览器发起请求,也能在这里增加一些header,但是考虑到安全和性能的原因,对JS控制 header的能力做了一些限制,比如host和cookie, user-agent等这些字段,JS是无法干预的。
现在的浏览器对UA都设置了自动选择,但也给开发保留了自定义设置的功能,通过控制台的 Network conditions 就可以自定义UA了。 - 中间代理。如果用户请求要经过一些中间代理(比如公司网关),中间代理能够查看和修改用户的全部数据,任何头部字段。除非我们使用了HTTPS。
- Accept-Charset
- Accept-Encoding
- Access-Control-Request-Headers
- Access-Control-Request-Method
- Connection
- Content-Length
- Cookie
- Cookie2
- Content-Transfer-Encoding
- Date
- Expect
- Host
- Keep-Alive
- Origin
- Referer
- TE
- Trailer
- Transfer-Encoding
- Upgrade
- User-Agent
- Via
至于能不能修改 http header
- 一般来说,是不建议修改UA的,有很多网站是根据这个字段做内容适配的,比如PC和手机肯定是不一样的内容。还有最重要的host字段,如果随便修改这个值,比如将腾讯首页改成百度一下,你就知道,那目的网站也返回不了正确的内容。
- 有一些字段能够修改,比如connection,cache-control等。不会影响你的正常访问,但有可能会慢一点。
- 还有一些字段可以删除,比如你不希望网站记录你的访问行为或者历史信息,你可以删除cookie,referfer等字段。
- 当然你也可以自定义构造任意你想要的字段,一般没什么影响,除非header太长导致内容截断。通常自定义的字段都建议X-开头。比如X-test: lance。
5.总结
这次是因为项目中涉及到了外网访问,需要设置 User-Agent, 所以调研了一些资料,不过现在看来,如果项目是通过浏览器访问,那么UA必定是修改不了的,虽然 Web API 中的 Fetch 有提到可以在 header 中修改 User-Agent, 不过多次尝试仍然设置失败。现在看来是当 fetch 不通过浏览器,直接通过JS 发请求,才有可能设置成功,具体走 JS 发请求设置UA的,我也没试过,以后有机会再试试吧。
、