设备指纹识别之User Agent 解析User Agent 解析
zoerywzhou@163.com
http://www.cnblogs.com/swje/
作者:Zhouwan
2017-4-6
最近由于设备指纹识别项目需要,想要解析UserAgent(用户代理)以此来分析PC端的browserInfo。在网上找了些参考资料,以及在github上参考的代码,总结整理如下。
有一个深深的感触:网上供参考的东西,不一定是全都对的啊,哎,血的教训,折腾了好几个小时,终于弄清楚了问题所在。总结如下:
参考博客:
- 浏览器UA信息实时解析页面(可获取用户目前所登录的浏览器信息):http://www.useragentstring.com/index.php
- 基于不同浏览器的上述解析页面的信息展示:用户代理
- Github上用来解析UA的几个开源库:
-
各种语言的总库:ua-parser
-
Python implementation of ua-parser:ua-parser/uap-python
-
- 一个用于解析UA来得到用户终端信息的JS库:
-
我的实践之环境配置:
不知道是不是我命途多舛,明明是很顺利的事情,我按照网上的步骤做的时候,总会遇到这样那样的问题。。。下面记录一下:
我选择了ua-parser的python实现,也就是 ua-parser/uap-python。
首先根据Github上的Readme文档说明,开始配置环境(血的教训由此开始):
Readme文档说明如下:
其实这上面说的倒是很清楚,如果我按照第一个安装方式(pip install ua_parser),倒也不会出现后续的问题。
由于之前在pip上吃过苦头(自动安装的模块版本和其他模块版本不一致,导致不能正常使用),所以在能自己手动安装的情况下,我就想尽量避免出现以往的问题。于是乎,本宝宝就想自己动手丰衣足食,采取了第二种安装方式,即先把该github 文档下载下来,再用以下命令安装:python setup.py install 。把github上的ua-parser/uap-python 下载到本地,目录如下:
当我配置好环境之后,开始测试:
from ua_parser import user_agent_parser
然后就报错:ImportError: no module named _regexes
于是乎我就在没有卸载的前提下试了一下第一种配置方案(pip install ua_parser),但是很显然,之前setup.py已经配置过主要的部分(user_agent_parser.py)了,就没能成功配置“次主要”的部分(regexes.py)。
网上也找了其他的解决方案,也尝试了
对user_agents的简要介绍:user_agents
is a Python library that provides an easy way to identify/detect devices like mobile phones, tablets and their capabilities by parsing (browser/HTTP) user agent strings.
看到这句话:user-agents
is hosted on PyPI ,我就去原始的官方文档PyPI 里面去看了看,心想原始发布的应该没什么问题的吧。
看到官方文档的installation里面只提到了pip的方法,我 就决定把之前装的乱八七糟的全都卸载了,就按照这一句话安装试试看。
结果怎么着,就成功了。。。哎,宝宝好生气哦。。不过还是要静下心来分析一下问题到底出在哪里。对比了一下我安装失败和安装成功ua_parser 前后的配置文件,发现了问题所在:可以发现,由Github上提供的项目中,没有文件_regexes.py,也就是我的文档报错的主要原因。。。。而直接通过pip安装时,是从官网上下载的whl文件,是包含文件_regexes.py的。所以最终执行成功。
一言以蔽之:
- 针对这个项目中所提供的安装方案:安装时用pip命令安装,而不要用setup.py安装,原因很简单:Github上提供的文档缺少_regexes.py文件,若直接用setup.py安装会因为缺少文件而导致安装文件不全,进而导致导入文件失败。
- 针对平时安装过程中出现的错误:如果提供了多种方案,其中一种方案失败的话,就彻底删除,然后再尝试第二种方案。几种方案都不行的话,再去网上寻找解决方案。
总会成功的!!!
我的实践之解析UserAgent
代码展示:
# 解析 UserAgent def userAgent_parser(): pp = pprint.PrettyPrinter(indent=4) sql = 'select distinct browserInfo from selected_pc order by uname' cursor.execute(sql) db.commit() browserInfo = cursor.fetchall() ua_string = str(browserInfo[0][0]) #ua_string = ua_string print ua_string parsed_string = user_agent_parser.Parse(ua_string) pp.pprint(parsed_string) # 连接数据库,测试并查看解析结果 # connect to databases db = MySQLdb.connect("10.60.150.192","zhouwan","940828","thinkdevice") cursor = db.cursor() userAgent_parser()
运行结果:
就是酱紫~
好啦,大功告成,可以根据这个解析结果来分析browserInfo啦,继续搬砖~