Organization 멤버 팀을 스크래핑하여 랭킹을 만들어 보았습니다.

SDT의 Qiita Organization이 점점 더 뜨거워졌습니다!
라고 하는 것으로 어쩐지 랭킹을 만들어 보았습니다~(라고 하는 것은 무슨 일이다!!)

소스 코드



nnsnodnb/sdt-qiita-ranking | GitHub

공개 페이지 샘플





대체로 이런 느낌. 대체로...
아직은 SDT내의 것 밖에 볼 수 없습니다만 앞으로, 여가가 있을 때 어느 Organization에서도 랭킹을 취할 수 있도록 API를 만들려고 생각하거나 생각하고 있지 않거나!!

스크래핑



패키지



requirements.txt
beautifulsoup4==4.5.0
bottle==0.12.9
Jinja2==2.8
MarkupSafe==0.23

Jinja2라든지 사용했는지 묻지 말아 주세요:;(∩´﹏`∩);:

패키지 가져오기♪


from urllib.request import urlopen
from bs4 import BeautifulSoup

정리하는 부분을 정리



get_soup()
url = 'http://qiita.com/organizations/smartdt/members'
html = urlopen(url)
return = BeautifulSoup(html, 'html.parser')

멤버 목록 및 컨트리뷰트 수



get_contribution()
soup = get_soup()

contribution_array = {}
# organizationMemberList_itemクラスのliタグをすべて取得
members = soup.findAll('li', class_='organizationMemberList_item')

for member in members:
    # メンバーごとのaタグの1番目を取得
    a = member.find('a')
    # メンバーごとのorganizationMemberList_memberProfileクラスのdivタグの1番目を取得
    profiles = member.find('div', 'organizationMemberList_memberProfile')
    # 上で取得したdivタグの中からorganizationMemberList_memberStatsクラスのdivタグをすべて取得しその2番目を指定
    contribute = profiles.findAll('div', 'organizationMemberList_memberStats')[1]

    # a.attrs['href'] -> nnsnodnb
    name = a.attrs['href'].split('/')[1]
    # contribute.text -> 50 Contribution
    number = int(contribute.text.split(' Con')[0])

    contribution_array.update({name: number})

회원 아이콘



get_membericon()
soup = get_soup()

icons = {}
# organizationMemberList_iconクラスのimgタグをすべて取得
member_icons = soup.findAll('img', 'organizationMemberList_icon')
# organizationMemberList_itemクラスのliタグをすべて取得
members = soup.findAll('li', class_='organizationMemberList_item')

for index in range(len(members)):
    a = members[index].find('a')
    name = a.attrs['href'].split('/')[1]
    # メンバーアイコンリストのそれぞれのメンバーごとからsrc属性を取り出す
    icon = member_icons[index].attrs['src']

    icons.update({name: icon})

멤버 리스트 및 컨트리뷰트 수와 멤버 아이콘에 관계를 갖게 하기 위해 이번에는 name 를 key로 했습니다.

순위순으로 정렬



리스트에서는 keyvalue 의 관계를 갖게 할 수 없기 때문에 사전을 사용하고 있습니다.
그러나 사전은 어디까지나 사전이므로 차례로 흩어져 출력됩니다. 울고 싶다
그래서 순서대로 꺼내 목록에 넣는 형태를 취합니다.
또, 부딪치면 오름차순으로 데이터가 추가되고 있으므로 reverse() 를 잊지 않고

ranking()
contribution = get_contribution()

names, numbers = [], []
for key, value in sorted(contribution.items(), key=lambda x:x[1]):
    names.append(key)
    numbers.append(value)

user_icons = get_membericon()

names.reverse()
numbers.reverse()

template에 흘려



이번에는 웹 프레임 워크에 Bottle를 사용했습니다.
사용법은 구그면 많이 나온다! 해야!
from bottle import template, get, run

기본적으로 이것은 괜찮습니다.

template에 흘리다
return template('hoge')
return template('foo', name = name)

대체로 이런 느낌으로 하면 어떻게든~hoge 이나 foo 곳은 어플리케이션 디렉토리에 views 폴더를 만들어 아래에 hoge.tpl 이나 foo.tpl 등을 만든다! HTML과 동일
hoge.tpl 내에서 Python 코드를 실행하려면 %를 붙여 실행할 수 있습니다.
또, template('foo', name = name) 와 같은 경우는 hoge.tpl 안에 {{ name }} 로 하는 것으로 옮겨놓을 수가 있습니다. mustache 그대로입니다.

또, for 이나 if 를 사용해 루프등을 종료시키는 경우는 이하와 같이 할 수 있습니다

for 샘플
% for i in range(10):
% # ターミナルに出力
% print(i)
% end

if 샘플
% if name == 'nnsnodnb':
% <p>やっほ〜!</p>
% else:
% <p>おめー誰だよwwwww</p>
% end

역시 들여쓰지 않으면 기분 나쁘네요! !
물론 들여쓰기를 하여 hoge.tpl 를 기술하는 것도 가능합니다

라는 느낌으로 푹신푹신 코딩하면 공개 페이지 샘플과 같은 페이지가 완성됩니다.

Bottle 실행



main()
run(host = '0.0.0.0')
$ python hoge.py

요약



이런 것이 존재하고 있는 것만으로 어쩐지 모두의 전투력을 가시화할 수 있어 목표가 느슨하게 가시화되어 왔습니다!

뭔가 있으면 코멘트나 편집 리퀘스트 등 내주시면 다행입니다!

좋은 웹페이지 즐겨찾기