ua即UserAgent,由于公司业务需求,需要对请求日志中的ua进行分析,目前已收集并分析60W,并且还呈现上升趋势。
这篇博客主要讲下分析的思路。
1.获取ua。
1.1请求日志由kafka出来存放在hadoop的hdfs中,每个小文件几k到20M不等的gz文件。
1.2使用hadoop的 CombileFileInputFomat 对当天的小文件进行处理,截取区请求日志中的ua部分放到缓存中,key为文件名,value为整个文本的内容分行处理。PS:初始化任务的时候读取数据库中已存在的ua。
1.3如果检测到行的ua则以|拼接,一个map的输出则为该文件中的所有新的ua.最后生成的文件结构为 key是文件名 value是这个文件中新的ua以|分割拼接的一行。
1.4 hadoop任务一天生成一个本地文件,交个后续系统进行分析。PS:有人可能会说生成的文件放到hdfs上我的代码区拉下来分析不可以吗?可以!但是秉着高内聚低耦合的原则,不同的项目之间尽量减少联系。
2.拿到文件之后,一行一行的读取。
2.1 从一行中以|分割取出单个ua进行处理。
2.2 ua的规则类型我分为三类。
2.2.1 andorid手机的ua类型,这种一般都有关键字 build/ ,如mozilla/5.0 (linux; android 1.6; zh-cn; htc magic build/) applewebkit/528.5+ (khtml, like gecko) version/3.1.2 mobile safari/525.20.1,编写正则截取htc magic 这个关键字。做后续处理。
2.2.2 不规则的andorid手机ua类型(即没有build/关键字),此种情况需要创建以及各已有的品牌列表常用的品牌,循环列表ndexof(品牌),如果有品牌关键字从品牌后开始截取40位,以空格分割区第一值为版本号。
2.2.3 还有IOS系统的ua,这种ua很少有机型,通过这种ua只能获取系统的版本号,和少许信息如:是iphone \ipad\mac等
3.1在步骤2中获取的结果组成链接如http://www.tera-wurfl.com/explore/search.php?action=browse&brand=2Good到该网站爬取内容,如果该品牌有对应的信息,则根据搜索结果重新促成链接如:http://www.tera-wurfl.com/explore/?action=wurfl_id&id=2good_pro_2_ver1 再进行爬取,如果有结果则解析dom找到合适的值。
需要注意的几点:
1.最好 使用三张表来构建整个体系 如hadoop_ua\ua\phone
1.1 当新的ua传过来的时候截取品牌,区phone表中检测时候存在该品牌,如果存在直接插入到ua表中,同时更新hadoop_ua的状态。PS:ua和phone表通过phone_id关联!如果不存在在进行下一步处理
1.2 由于多个不同的ua可能截取到相同的 品牌,所以当ua不断进来的时候现在本地缓存中进行处理分组,此时一个品牌对应多条数据也就是多个hadoop_ua的id,通过该品牌组装成device_url放到redis中,redis中数据结构为 一个url,一个ua,对应多个hadoop_ua的id
1.3使用redis list的pop取出url,判断如果是device_url则区访问相应的网站,如果有结果进行解析,在继续访问新链接,如果有内容则进行解析,如果解析到相应的结果数据则存入到 phone表中,包相应的多条数据插入到ua表中,同时更新hadoop_ua表。
1.4对于爬虫服务你可以自己用httpclient、htmlcleaner、xpath结合解析,也可以用开源的框架webmagic。如果自己写动态ip代理的话 最后提供一个外部切换的接口,方便你手动更换ip代理,另外对于浏览器机型检测的时候可以适当使用
<!--手机型号和浏览器检测工具--> <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUtils</artifactId> <version>1.20</version> </dependency>,但是对于国内的好多浏览器你就只能用关键字加正则来提取浏览器信息了。工作之余随便写写,好多流程的细节没加进去、还有流程图话的连我都不敢恭维,多多包涵。