当前位置: 首页 > news >正文

网站开发后端待遇wordpress 删除自豪

网站开发后端待遇,wordpress 删除自豪,农村建设网站的重要性,六安开发区网站首先#xff0c;神枪镇楼#xff1a;背景最近老板爱上了吃鸡#xff08;手游#xff1a;全军出击#xff09;#xff0c;经常拉着我们开黑#xff0c;只能放弃午休的时间#xff0c;陪老板在沙漠里奔波。 上周在在微信游戏频道看战绩的时候突发奇想#xff0c;是不是可… 首先神枪镇楼背景最近老板爱上了吃鸡手游全军出击经常拉着我们开黑只能放弃午休的时间陪老板在沙漠里奔波。 上周在在微信游戏频道看战绩的时候突发奇想是不是可以通过这个方式抓取到很多战斗数据然后分析看看有什么规律。秀一波战绩开黑情况下我们团队吃鸡率非常高近100场吃鸡次数51次简单评估了一下觉得可行咱就开始。Step 1  分析数据接口第一步当然是把这些战绩数据采集下来首先我们需要了解页面背后的故事。去看看页面是如何获取战斗数据的。使用Charles抓包抓包实现在Mac下推荐使用工具Charles来从协议层抓取手机上的流量。原理就是在Mac上开启一个代*理*服务器然后将手机的网络代*理设置为Mac这样手机上的所有流量都会经过我们的代*理*服务器了。 大致流程如下https加密流量的处理在实际操作的时候发现微信所有的流量都走了HTTPS导致我们的抓到的都是加密数据对我们没有任何参考意义。 经过研究可以通过在手机和电脑都安装Charles根证书的方式来实现对Https流量的分析具体操作可以参考charles mac下https抓包和iphone https抓包解决Charles无法正常抓包iOS 11中的Https请求安装证书后我们的流量大致是这样子的经过上述的配置我们已经可以读取到https的请求和响应数据了。如下图所示windows下用findler可以实现相同的功能其实这就是一个非常典型的中间人场景数据接口接下来就根据这些数据来找出我们需要的接口了经过分析主要涉及三个接口获取用户信息接口获取用户战绩列表接口获取用户指定战绩详细信息接口下面我们一个一个看1. 获取用户信息接口requestAPI/cgi-bin/gamewap/getpubgmdatacenterindex方法GET参数openid、pass_ticketcookiekey pass_ticket、uin、pgv_pvid、sd_cookie_crttime、sd_useridresponse{    user_info: {        openid: oODfo0pjBQkcNuR4XLTQ321xFVws,        head_img_url: http://wx.qlogo.cn/mmhead/Q3auHgzwzM5hSWxxxxxUQPwW9ibxxxx9DlxLTsKWk97oWpDI0rg/96,        nick_name: 望,        role_name: xxxx,        zone_area_id: 0,        plat_id: 1    },    battle_info: {        total_1: 75,        total_10: 336,        total_game: 745,        total_kill: 1669    },    battle_list: [{        map_id: 1,        room_id: 6575389198189071197,        team_id: 57,        dt_event_time: 1530953799,        rank_in_ds: 3,        times_kill: 1,        label: 前五,        team_type: 1,        award_gold: 677,        mode: 0    }],    appitem: {        AppID: wx13051697527efc45,        IconURL: https://mmocgame.qpic.cn/wechatgame/mEMdfrX5RU0dZFfNEdCsMJpfsof1HE0TP3cfZiboX0ZPxqh5aZnHjxPFXUGgsXmibe/0,        Name: 绝地求生 全军出击,        BriefName: 绝地求生 全军出击,        Desc: 官方正版绝地求生手游,        Brief: 枪战 | 808.2M,        WebURL: https://game.weixin.qq.com/cgi-bin/h5/static/detail_v2/index.html?wechat_pkgiddetail_v2appidwx13051697527efc45show_bubble0,        DownloadInfo: {            DownloadURL: https://itunes.apple.com/cn/app/id1304987143,            DownloadFlag: 5        },        Status: 0,        AppInfoFlag: 45,        Label: [],        AppStorePopUpDialogConfig: {            Duration: 1500,            Interval: 172800,            ServerTimestamp: 1531066098        },        HasEnabledChatGroup: false,        AppType: 0,        game_tag_list: [绝地求生, 正版还原, 好友开黑, 百人对战, 超大地图],        recommend_reason: 正版绝地求生荒野射击,        size_desc: 808.2M    },    is_guest: true,    is_blocked: false,    errcode: 0,    errmsg: ok}分析openid是用户的惟一标识。2. 获取用户战绩列表接口requestAPI/cgi-bin/gamewap/getpubgmbattlelist方法GET参数openid、pass_ticket、plat_id、after_time、limitcookiekey pass_ticket、uin、pgv_pvid、sd_cookie_crttime、sd_useridresponse{errcode: 0,errmsg: ok,next_after_time: 1528120556,battle_list: [{    map_id: 1,    room_id: 6575389198111172597,    team_id: 57,    dt_event_time: 1530953799,    rank_in_ds: 3,    times_kill: 1,    label: 前五,    team_type: 1,    award_gold: 677,    mode: 0}, {    map_id: 1,    room_id: 6575336498940384115,    team_id: 11,    dt_event_time: 1530941404,    rank_in_ds: 5,    times_kill: 2,    label: 前五,    team_type: 1,    award_gold: 632,    mode: 0}],has_next: true}分析这个接口用after_time来进行分页遍历获取时可以根据接口响应的has_next和next_after_time来判断是否还有下一页的数据。列表里面的room_id是每一场battle的惟一标识。3. 获取用户战绩详情接口requestAPI/cgi-bin/gamewap/getpubgmbattledetail方法GET参数openid、pass_ticket、room_idcookiekey pass_ticket、uin、pgv_pvid、sd_cookie_crttime、sd_useridrequest{errcode: 0,errmsg: ok,base_info: {    nick_name: 柚茶,    head_img_url: http://wx.qlogo.cn/mmhead/xxxx/96,    dt_event_time: 1528648165,    team_type: 4,    rank: 1,    player_count: 100,    role_sex: 1,    label: 大吉大利,    openid: oODfo0s1w5lWjmxxxxxgQkcCljXQ},battle_info: {    award_gold: 622,    times_kill: 6,    times_head_shot: 0,    damage: 537,    times_assist: 3,    survival_duration: 1629,    times_save: 0,    times_reborn: 0,    vehicle_kill: 1,    forward_distance: 10140,    driving_distance: 5934,    dead_poison_circle_no: 6,    top_kill_distance: 223,    top_kill_distance_weapon_use: 2924130819,    be_kill_user: {        nick_name: 小旭,        head_img_url: http://wx.qlogo.cn/mmhead/ibLButGMnqJNFsUtStNEV8tzlH1QpwPiaF9kxxxxx66G3ibjic6Ng2Rcg/96,        weapon_use: 20101000001,        openid: oODfo0qrPLExxxxc0QKjFPnPxyI    },    label: 大吉大利},team_info: {    user_list: [{        nick_name: ooo,        times_kill: 6,        assist_count: 3,        survival_duration: 1638,        award_gold: 632,        head_img_url: http://wx.qlogo.cn/mmhead/Q3auHgzwzM4k4RXdyxavNxxxxUjcX6Tl47MNNV1dZDliazRKRg,        openid: oODfo0xxxxf1bRAXE-q-lEezK0k    }, {        nick_name: 我吃炒肉,        times_kill: 2,        assist_count: 2,        survival_duration: 1502,        award_gold: 583,        head_img_url: http://wx.qlogo.cn/mmhead/sTJptKvBQLKd5SAAjOF0VrwiapUxxxxFffxoDUcrVjYbDf9pNENQ,        openid: oODfo0gIyDxxxxZpUrSrpapZSDT0    }]},is_guest: true,is_blocked: false}分析这个接口响应了战斗的详细信息包括杀*敌数、爆*头数、救人数、跑动距离等等足够我们分析了。这个接口还响应了是被谁杀死的以及组团成员的openid利用这个特性我们这可无限深度的发散爬取更多用户的数据。至于cookie中的息pass_ticket等信息肯定是用于权限认证的在上述的几次请求中这些信息都没有变化。所以我们不需要深研其是怎么算出来的只需要抓包提取到默认信息后填到代码里面就可以用了。Step 2 爬取数据接口已经确定下来了接下来就是去抓取足够量的数据了。使用requests请求接口获取数据    url https://game.weixin.qq.com/cgi-bin/gamewap/getpubgmdatacenterindex?openid%splat_id0uinkeypass_ticket%s % (openid, settings.pass_ticket)    r requests.get(urlurl, cookiessettings.def_cookies, headerssettings.def_headers, timeout(5.0, 5.0))    tmp r.json()    wfile os.path.join(settings.Res_UserInfo_Dir, %s.txt % (rediskeys.user(openid)))    with codecs.open(wfile, w, utf-8) as wf:        wf.write(simplejson.dumps(tmp, indent2, sort_keysTrue, ensure_asciiFalse))参照这种方式我们可以很快把另外两个接口写好。使用redis来标记已经爬取过的信息在上述接口中我们可能从用户A的入口进去找到用户B的openid然后从用户B的入口进去又找到用户A的openid。为了避免重复采集所以我们需要记录下哪些信息是我们采集过的。 核心代码片断# rediskeys.user_battle_list 根据openid获取存在redis中的key值def user_battle_list(openid):    return ubl_%s % (openid)# 在提取battle list之前首先判断这用用户的数据是否已经提取过了if settings.DataRedis.get(rediskeys.user_battle_list(openid)):    return True# 在提取battle list之后需要在redis中记录用户信息settings.DataRedis.set(rediskeys.user_battle_list(openid), 1)使用celery来管理队列celery是一个非常好用的分布式队列管理工具。我这次只打算在我自己的电脑上运行所以并没有用到分布式的功能。 我们创建三个task和三个queuetask_queues (    Queue(queue_get_battle_info, exchangeExchange(priority, typedirect), routing_keygbi),    Queue(queue_get_battle_list, exchangeExchange(priority, typedirect), routing_keygbl),    Queue(queue_get_user_info, exchangeExchange(priority, typedirect), routing_keygui),)task_routes ([    (get_battle_info, {queue: queue_get_battle_info}),    (get_battle_list, {queue: queue_get_battle_list}),    (get_user_info, {queue: queue_get_user_info}),],)然后在task中控制API请求和Redis数据实现完整的任务逻辑如app.task(nameget_battle_list)def get_battle_list(openid, plat_idNone, after_time0, update_timeNone):    # 判断是否已经取过用户战绩列表信息    if settings.DataRedis.get(rediskeys.user_battle_list(openid)):        return True    if not plat_id:        try:            # 提取用户信息            us handles.get_user_info_handles(openid)            plat_idus[plat_id]        except Exception as e:            print can not get user plat_id, openid, traceback.format_exc()            return False    # 提取战绩列表    battle_list handles.get_battle_list_handle(openid, plat_id, after_time0, update_timeNone)    # 为每一场战斗创建异步获取详情任务    for room_id in battle_list:        if not settings.DataRedis.get(rediskeys.user_battle(openid, room_id)):            get_battle_info.delay(openid, plat_id, room_id)    return True开始抓取因为我们是发散是爬虫所以需要给代码一个用户的入口需要手动创建一个用户的采集任务。from tasks.all import get_battle_listmy_openid oODfo0oIErZI2xxx9xPlVyQbRPgYmy_platid 0get_battle_list.delay(my_openid, my_platid, after_time0, update_timeNone)有入口之后我们就用celery来启动worker去开始爬虫# 启动获取用户详情workercelery -A tasks.all worker -c 5 --queuequeue_get_user_info --loglevelinfo -n get_user_info%h# 启动获取战绩列表workercelery -A tasks.all worker -c 5 --queuequeue_get_battle_list --loglevelinfo -n get_battle_list%h# 启动获取战绩详情workercelery -A tasks.all worker -c 30 --queuequeue_get_battle_info --loglevelinfo -n get_battle_info%h这样我们的爬虫就可以愉快的跑起来了。再通过celery-flower来查看执行情况。celery flower -A tasks.all --brokerredis://:$REDIS_PASS$REDIS_HOST:$REDIS_PORT/10通过flower我们可以看到运行的效率还是非常不错的。在执行过程中会发现get_battle_list跑太快导致get_battle_info即使开了30个并发都还会积压很多。所以需要适时的去停一下这些worker 在我们抓到20万条信息之后就可以停下来了。Step 3  数据分析1. 平均用户日在线时长2小时从分布图上看大部分用户都在1小时以上最猛的几个人超过8小时。注我这里统计的是每一局的存活时间实际在线时长会比我这个更长。2. 女性角色被救次数高于男性终于知道为什么有那么多人妖了原来在游戏里面可以占便宜啊。3. 女性角色救人次数高于男性给了大家一个带妹上分的好理由。4. 周五大家最忙估计周五大家都要忙着交差和写周报了。5. 晚上22点是游戏高峰凌晨还有那么多人玩你们不睡觉吗6. 最远击*杀距离639米我看了一下98K、SKS和AWP的有效射程大致都在800米以内所以这个值可信度还是可以的。 反过来看抖音上的那些超远距离击*杀应该都是摆拍的。7. 能拿到「救死扶伤」称号才是最高荣耀从分布情况可以看出来救死扶伤比十杀还要难。能拿到救死扶伤称号的大部分都是女性角色再一次证明玩游戏要带妹。 回归到这个游戏的本质那就是生存游戏没什么比活下来更重要的了。结尾这次爬虫主要是利用了微信游戏频道可以查看陌生人数据的场景才能提取到这么多数据。我们可以通过同样的手段来分析王者荣耀和其它游戏的数据有兴趣的同学可以尝试一下。 最后再说一下UMP9是把好枪配2倍镜非常爽。作者张波来源http://blog.codingroad.com/python-get-and-analysis-pubg-mobile-data.html版权归原作者所有转载仅供学习使用不用于任何商业用途如有侵权请留言联系删除感谢合作。数据与算法之美用数据解决不可能长按扫码关注
http://www.yutouwan.com/news/328343/

相关文章:

  • ant design 做网站图片生成器免费
  • 高唐做网站建设的公司哈尔滨市做网站优化
  • 北京做网站比较有名的公司大型网站建设兴田德润专业
  • o2o网站北京装修公司十大排名
  • 免费网站的app网站响应式技术
  • 泰安做网站公司哪家比较好在门户网站上爆光怎么做
  • 网站建设网站制作有限湖南网络工程职业学院高职扩招
  • 黑龙江建筑职业技术学院招生网站做网站 用 显示器
  • 做甜品网站栏目建设工程标准 免费下载网站
  • 儿童故事网站建设网站建设色系搭配
  • 网站制作代理平台小游戏网站建设
  • iis 网站打不开企业网站页面
  • 东莞市公司网站建设怎么样网页qq登陆保护
  • 计算机网站开发工作证学校校园网站
  • 转转怎么做钓鱼网站施工企业主要负责人包括
  • 简单网站开发实例网页版微信怎么加好友
  • 目前做那些网站致富apache 安装 wordpress
  • 福州企业网站制作wordpress添加表
  • 重庆企业模板建站信息wordpress插件放那个文件夹
  • 做网站优化两年遇到的SEO常态桔子建站官网
  • 网站首页打开速度洛阳做网站哪家专业
  • 做非法网站判刑多少年asp.net网站开发案例教程
  • 广州市企业网站制作个人备案做公司网站
  • 溧阳网站建设价格wordpress 调用文章简介
  • 免费自助建站软件网络空间搜索引擎
  • 网站搭建步骤原创文章代写平台
  • 岳阳公司网站开发服务器如何架设网站
  • 无站点推广就是不在网上推广专做美妆的视频网站
  • 技术专业网站建设wordpress屏蔽谷歌字体
  • 网站正在建设中备案燕郊 网站开发