前言
又到了碧蓝小姐选拔赛的时间(大雾),预算赛中很多角色排名波动较大,无疑是一件激动人心的事情。那么将比赛过程中的结果保存并做数据可视化,无疑对分析各位选手实力有重要意义,同时也会为各选手备战明年大选提供帮助(大雾)。
思路
数据获取
游戏内获取
直接获取游戏内名次固然是一个好的选择,有点如下:
1.数据更新及时,游戏内更新时间是固定的。
2.可以获得所有选手的排名。
但是想要做到这一点,首先要对游戏进行抓包破解,这对我来说太艰难了……况且还要爬三个服务器
游戏外获取
碧蓝海事局也在这里人工更新数据,获取较为容易但是缺点也很严重,一是实时数据只有前十五名,二是人工更新数据的延迟……
当然我只能选海事局了。
代码实现
数据爬虫
需要用python脚本定时从wiki上获取排名。考虑页面过于杂乱,要先进行简化。跳到显示排名的段落点源代码,就会跳到这个段落的编辑页面,显示的内容是wiki语法的表格形式。此处应注意浏览器中登陆账号后显示的页面和脚本获取的页面不一致,解析以脚本为准。
# -*- coding: utf-8 -*-
import requests
import json
import urllib
import sys
from bs4 import BeautifulSoup
import time
gf,rf,gjf = "","",""
def gettext():
global gf,rf,gjf
request = urllib.request.Request("http://wiki.joyme.com/blhx/index.php?title=2019%E5%B9%B4%E8%88%B0%E8%88%B9%E4%BA%BA%E6%B0%94%E6%8A%95%E7%A5%A8%E6%B4%BB%E5%8A%A8&action=edit§ion=4")
request.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362")
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
soup=BeautifulSoup(html,'lxml')
body = soup.body
wrapper = body.find_all(id="wrapper")[0]
container = wrapper.find(class_="joymewiki-content-block container")
textarea = container.div.section.find(id="bodyContent").div.find(id="mw-content-text").textarea.string
div = BeautifulSoup(textarea,'lxml').find_all("div")
gf = div[0].string.split('able"')[1]
rf = div[1].string.split('able"')[1]
gjf = div[2].string.split('able"')[1]
def textmaker():
global gf,rf,gjf
dir = ["gf/","rf/","gjf/"]
index = 0
for i in (gf,rf,gjf):
f = open(dir[index]+str(time.time()),"w",encoding='utf-8')
f.write(dir[index]+" - "+str(time.asctime())+'\n')
i = i.split('小图标')
for j in range(1,16):
f.write(str(j)+" "+i[j].split("}}")[0][1:]+'\n')
index = index+1
if __name__=="__main__":
while 1:
try:
text = gettext()
textmaker()
print(time.asctime())
except AttributeError:
print("暂时无法获得数据")
except urllib.error.HTTPError:
print("暂时无法获得数据")
time.sleep(3000)
#break
我发誓这是我最后一次用urllib,太尼玛……换requests省事多了。
gettext使用urllib获取页面代码再用BeautifulSoup解析,这里用了lxml,pip install lxml
。
获取到的string是wiki语法的表格:
===国服===
{| class="wikitable"
! 1
|{{小图标|拉菲}}
|-
! 2
|{{小图标|腓特烈大帝}}
|-
! 3
|{{小图标|独角兽}}
|-
! 4
|{{小图标|光辉}}
|-
! 5
|{{小图标|长门}}(鲨)
|-
! 6
|{{小图标|Z23}}
|-
! 7
|{{小图标|逸仙}}
|-
! 8
|{{小图标|绫波}}(柚)
|-
! 9
|{{小图标|俾斯麦}}
|-
! 10
|{{小图标|雪风}}(莲)
|-
! 11
|{{小图标|伊吹}}(峦)
|-
! 12
|{{小图标|恶毒}}
|-
! 13
|{{小图标|吾妻}}(猉)
|-
! 14
|{{小图标|君主}}
|-
! 15
|{{小图标|加斯科涅}}
|}
===日服===
{| class="wikitable"
! 1
|{{小图标|大凤}}
|-
! 2
|{{小图标|长门}}
|-
! 3
|{{小图标|天狼星}}
|-
! 4
|{{小图标|巴尔的摩}}
|-
! 5
|{{小图标|伊吹}}
|-
! 6
|{{小图标|独角兽}}
|-
! 7
|{{小图标|光辉}}
|-
! 8
|{{小图标|天城}}
|-
! 9
|{{小图标|俾斯麦}}
|-
! 10
|{{小图标|赤城}}
|-
! 11
|{{小图标|拉菲}}
|-
! 12
|{{小图标|欧根亲王}}
|-
! 13
|{{小图标|爱宕}}
|-
! 14
|{{小图标|雪风}}
|-
! 15
|{{小图标|克利夫兰}}
|}
===国际服===
{| class="wikitable"
! 1
|{{小图标|天城}}
|-
! 2
|{{小图标|俾斯麦}}
|-
! 3
|{{小图标|大凤}}
|-
! 4
|{{小图标|拉菲}}
|-
! 5
|{{小图标|埃塞克斯}}
|-
! 6
|{{小图标|罗恩}}
|-
! 7
|{{小图标|欧根亲王}}
|-
! 8
|{{小图标|企业}}
|-
! 9
|{{小图标|Z23}}
|-
! 10
|{{小图标|爱宕}}
|-
! 11
|{{小图标|长门}}
|-
! 12
|{{小图标|巴尔的摩}}
|-
! 13
|{{小图标|齐柏林伯爵}}
|-
! 14
|{{小图标|贝尔法斯特}}
|-
! 15
|{{小图标|让·巴尔}}
|}
用textmaker解析并分为国服、日服和国际服保存,文件名使用时间保证递增。
将代码放到服务器上运行,我就可以去睡觉了。