AtCoder의 랭킹을 python으로 스크래핑 해보십시오.

레이트 분포로서 물 이상이 강한 것은 알지만 별로 참가하지 않은 회색이 엉망이 많기 때문에 실제의 어떤 것인지를 스크래핑하여 참가 횟수 5회 이상의 참가자의 레이트를 빼냅니다. 랭킹의 표시 형식 등이 바뀌면 움직이지 않게 되지만 서포트는 하지 않습니다. 2019년 5월 30일 현재 이 코드는 움직입니다. jupyter 가정입니다.
import urllib.request
l=[]
for r in range(1,311):
    print(r)
    d=urllib.request.urlopen("https://atcoder.jp/ranking?desc=true&orderBy=competitions&page="+str(r)).read().decode('utf-8').replace(" ","").split("\n") 

    for i in range(len(d)):
        tmp=[]
        if d[i]=="<tr>":
            tmp.append(int(d[i+1].replace(r'<td class="no-break">',"").replace("</td>","")))
            tmp.append(d[i+2].replace("</span></a>","")[-18:].split(">")[-1])
            tmp.append(int(d[i+5].replace("<td><b>","").replace("</b></td>","")))
            tmp.append(int(d[i+6].replace("<td><b>","").replace("</b></td>","")))
            tmp.append(int(d[i+7].replace("<td>","").replace("</td>","")))
            l.append(tmp)

l에 순위, 사용자 이름, 현재 요율, 최고 요율, 참여 횟수를 입력합니다.
%matplotlib inline
from numpy import*

df=array(l)
df=df[df[:,-1]>=5]
x=[float("inf"),2800,2400,2000,1600,1200,800,400,0]
current=[]
high=[]
for i in range(len(x)-1):
    current.append(len(df[:,2][ (x[i]> df[:,2]) & (df[:,2] >=x[i+1]) ]))
    high.append(len(df[:,3][ (x[i]> df[:,3]) & (df[:,3] >=x[i+1]) ]))
print(current,high)

레이트로 나누어 current와 high에 넣습니다.
빨간색부터 순서대로
[139, 223, 488, 948, 1947, 2669, 2715, 2647]명
[150, 255, 488, 998, 2028, 2680, 2660, 2517]명
라는 것을 알았습니다.
from matplotlib.pyplot import*
pie(current, startangle=90,colors = ["red","orange","yellow","blue","cyan","green","brown","gray"])


재, 차, 녹색, 하늘색으로 비슷한 비율로 존재하는 것 같습니다.
pie(high, startangle=90,colors = ["red","orange","yellow","blue","cyan","green","brown","gray"])


high에서도 그다지 바뀌지 않았습니다. 끝.

좋은 웹페이지 즐겨찾기