Organization 멤버 팀을 스크래핑하여 랭킹을 만들어 보았습니다.
11403 단어 파이썬스크래핑BeautifulSoup병
라고 하는 것으로 어쩐지 랭킹을 만들어 보았습니다~(라고 하는 것은 무슨 일이다!!)
소스 코드
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로 했습니다.순위순으로 정렬
리스트에서는
key
와 value
의 관계를 갖게 할 수 없기 때문에 사전을 사용하고 있습니다.그러나 사전은 어디까지나 사전이므로 차례로 흩어져 출력됩니다. 울고 싶다
그래서 순서대로 꺼내 목록에 넣는 형태를 취합니다.
또, 부딪치면 오름차순으로 데이터가 추가되고 있으므로
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
요약
이런 것이 존재하고 있는 것만으로 어쩐지 모두의 전투력을 가시화할 수 있어 목표가 느슨하게 가시화되어 왔습니다!
뭔가 있으면 코멘트나 편집 리퀘스트 등 내주시면 다행입니다!
Reference
이 문제에 관하여(Organization 멤버 팀을 스크래핑하여 랭킹을 만들어 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nnsnodnb/items/272671f359ad7055670d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)