请教大神们如和根据 http header 判断来的请求是是不浏览器?

2020-06-23 10:13:15 +08:00
 iawes

只重定向来自浏览器的请求,而不重定向其他应用或者系统层的 80 请求?

5543 次点击
所在节点    程序员
48 条回复
MerlinShieh
2020-06-23 10:15:34 +08:00
user-agent ?
sayitagain
2020-06-23 10:19:50 +08:00
不考虑伪造,user-agent 就行咯
iawes
2020-06-23 10:35:09 +08:00
@sayitagain
@MerlinShieh
但是比如魅族手机连上 WiFi 时,会做 WiFiportal 认证判断 wifi 是否能访问网络,访问一个 mwzu 的网址,UA 里根本区分不出来吧?
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36
会被认定为是 chrome
belin520
2020-06-23 10:37:19 +08:00
@iawes #3 Android 的判断条件是判断是否有 'andr' 字符串。你这个 UA 里面不是标准的 Android 客户端的 UA
imn1
2020-06-23 10:49:57 +08:00
除非有设备判断,不然单靠 header 只有 UA 、cookies 相关
iawes
2020-06-23 10:56:14 +08:00
@belin520 这个 UA 是魅族手机连接 wifi 时候发出来的。
大神的意思是用 Mozilla + Android/Windows NT/Apple 这样判断?
icy37785
2020-06-23 10:58:23 +08:00
这是没办法判断的。
MerlinShieh
2020-06-23 10:58:41 +08:00
@iawes 移动设备,我记得好像可以判断设备端的,就像你用手机访问 web 和用 pc 访问 web,手机端的会跳到手机版网页的,pc 端的就是默认网页
MerlinShieh
2020-06-23 11:03:08 +08:00
@MerlinShieh
@iawes
request.headers['User-Agent'] 可以返回 User-Agent 的字符串
识别是否为手机客户端的只要识别 User-Agent 中是否有"Mobile"字段即可

这个不知道符不符合你的需求
hronro
2020-06-23 11:08:46 +08:00
你要知道不仅仅是 Header,整个 HTTP 都是纯文本的,而这些文本是 HTTP 请求的发送方可以完全自定义的。所以你想要准却判断所有 HTTP 请求的 Client 类型,这个从原理上讲就是不可能做到的,只能粗略判断遵守规范,带有准确的 User-Agent 的请求。

你之前提到的魅族手机连上 WiFi 时的请求,应该就不属于能准确判断的范围。
crella
2020-06-23 12:33:43 +08:00
我想问问有没有一些反爬措施会检查 header 里的 accept:gzip,deflate 语句?因为绝大多数浏览器都支持这个,但是爬虫教程一般不写这个语句。哪怕实际上不使用压缩模式传送数据,也可以要求 web 客户端支持 gzip 模式。
crella
2020-06-23 12:34:22 +08:00
楼主可以看看 header 里面的 set-cookie
beastk
2020-06-23 12:53:12 +08:00
上面不是有 x11 嘛,你可以做一个 agent 数据集,实在不行加上 js 获取分辨率等其他要素综合判断。
sayitagain
2020-06-23 12:53:29 +08:00
@iawes 得看你拿到的是否是标准的 ua
附我手机的 ua

这是自带浏览器的 ua
Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-N9760) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.2 Chrome/75.0.3770.143 Mobile Safari/537.36

这是微信内嵌浏览器的 ua
Mozilla/5.0 (Linux; Android 10; SM-N9760 Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36 MMWEBID/8989 MicroMessenger/7.0.15.1680(0x27000FB3) Process/tools We

但 ua 这东西伪造门槛太低了...不考虑伪造,你要做的就是尽量多的收集 ua 里的关键字对应什么.
kop1989
2020-06-23 12:54:23 +08:00
从正途上来说:不严谨的判断,就像楼上们说的 user agent 。
但还有一些方法属于侧面判断,比如关键字:浏览器指纹
iawes
2020-06-23 15:12:44 +08:00
@kop1989 不需要那么复杂的。。只有判断是不是浏览器就行
iawes
2020-06-23 15:13:15 +08:00
@MerlinShieh 不是判断是否手机,就是判断是否浏览器即可
kop1989
2020-06-23 15:15:11 +08:00
@iawes #16 嗯,这个看你需求而定。关键就是不复杂的判断方法是不准确的。上面也都说了,所有常规的浏览器特征都可以轻易伪造。如果你对准确性有很高要求,就需要我说的那些了。
iawes
2020-06-23 15:17:28 +08:00
@crella 不是为了防爬虫呢
不过这是一种思路,只有浏览器才会 accept gzip 格式?如果是操作系统或 app 自己的 80 端口传输数据不会有这个对吗?
iawes
2020-06-23 15:32:57 +08:00
@kop1989 嗯,我这里不考虑伪造不考虑爬虫。80%的的能区分出来是否是浏览器就行了,简单一些的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/683999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX