設備指紋識別之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啦,繼續搬磚~