티스토리 뷰
728x90
[이번에는 챔피언을 입력하면 롤 카운터를 출력해주는 봇을 만들어 보도록 하겠습니다.]
먼저 카운터를 가져올 사이트를 크롤링합니다. (이번 포스팅에서는 롤 인벤 사이트를 참고하여 제작하겠습니다.)
먼저 사이트 url 양식을 살펴보면 lol.inven.co.kr/dataninfo/counter/list.php?code=19 <- 가렌
lol.inven.co.kr/dataninfo/counter/list.php?code=1 <- 아칼리
요런 식으로 정리되어 있습니다. 각 챔피언에 코드가 할당되어 있는데, 규칙을 찾지 못해서 손수 딕셔너리를 제작하였습니다. ㅠㅠ
ChampNumberSet = {'아칼리':'1',
'알리스타':'2',
'아무무': '3',
'애니비아' : '4',
'애니' : '5',
'애쉬' : '6',
'블리츠크랭크' : '7',
'블츠' : '7',
'브랜드' : '8',
'케이틀린' : '9',
'카시오페아' : '10',
'초가스' : '11',
'코르키' : '12',
'문도 박사' : '13',
'문도' : '13',
'이블린' : '14',
'이즈리얼' : '15',
'피들스틱' : '16',
'갈리오' : '17',
'갱플랭크' : '18',
'가렌' : '19',
'그라가스' : '20',
'하이머딩거' : '21',
'이렐리아' : '22',
'잔나' : '23',
'자르반 4세' : '24',
'자르반' : '24',
'잭스':'25',
'카르마':'26',
'카서스':'27',
'카사딘':'28',
'카타리나':'29',
'케일':'30',
'케넨':'31',
'코그모':'32',
'르블랑':'33',
'리 신':'34',
'리신':'34',
'럭스':'35',
'말파이트':'36',
'말자하':'37',
'마오카이':'38',
'마스터 이':'39',
'마스터이':'39',
'마이':'39',
'미스 포츈':'40',
'미스포츈':'40',
'미포':'40',
'모데카이저':'41',
'모데':'41',
'모르가나':'42',
'몰가':'42',
'나서스':'43',
'니달리':'44',
'녹턴':'45',
'누누와 윌럼프':'46',
'누누':'46',
'올라프':'47',
'판테온':'48',
'뽀삐':'49',
'람머스':'50',
'레넥톤':'51',
'럼블':'52',
'라이즈':'53',
'샤코':'54',
'쉔':'55',
'신지드':'56',
'사이온':'57',
'시비르':'58',
'소나':'59',
'소라카':'60',
'스웨인':'61',
'타릭':'62',
'티모':'63',
'트리스타나':'64',
'트타':'64',
'트런들':'65',
'트린다미어':'66',
'트린':'66',
'트위스티드 페이트':'67',
'트페':'67',
'트위스티드페이트':'67',
'트위치':'68',
'우디르':'69',
'우르곳':'70',
'베인':'71',
'베이가':'72',
'블라디미르':'73',
'블라디':'73',
'워윅':'74',
'신 짜오':'75',
'신짜오':'75',
'질리언':'76',
'레오나':'77',
'오리아나':'78',
'탈론':'79',
'오공':'80',
'요릭':'81',
'스카너':'82',
'리븐':'83',
'제라스':'84',
'그레이브즈':'85',
'그브':'85',
'쉬바나':'86',
'피즈':'87',
'볼리베어':'88',
'아리':'89',
'빅토르':'90',
'세주아니':'91',
'직스':'92',
'노틸러스':'93',
'피오라':'94',
'룰루':'95',
'헤카림':'96',
'바루스':'97',
'다리우스':'98',
'드레이븐':'99',
'제이스':'100',
'자이라':'101',
'다이애나':'102',
'렝가':'103',
'신드라':'104',
'카직스':'105',
'엘리스':'106',
'제드':'107',
'나미':'108',
'바이':'109',
'쓰레쉬':'110',
'퀸':'111',
'자크':'112',
'리산드라':'113',
'아트록스':'114',
'루시안':'115',
'징크스':'116',
'야스오':'117',
'벨코즈':'118',
'브라움':'119',
'나르':'120',
'아지르':'121',
'칼리스타':'122',
'렉사이':'123',
'바드':'124',
'에코':'125',
'탐 켄치':'126',
'탐켄치':'126',
'킨드레드':'127',
'일라오이':'128',
'진':'129',
'아우렐리온 솔':'130',
'아우렐리온솔':'130',
'탈리야':'131',
'클레드':'132',
'아이번':'133',
'카밀':'134',
'라칸':'135',
'자야':'136',
'케인':'137',
'오른':'138',
'조이':'139',
'카이사':'140',
'파이크':'141',
'니코':'142',
'사일러스':'143',
'유미':'144',
'키아나':'145',
'세나':'146',
'아펠리오스':'147',
'세트':'148',
'릴리아':'149',
'요네':'150',
'사미라':'151',
'세라핀':'152',
'렐':'153'
}
그럼 이제 카운터를 크롤링 해봐야겠죠?
카운터를 크롤링하는 코드는 아래와 같습니다.
import requests,time
from bs4 import BeautifulSoup
import re
CounterChampList_F = []
test_url = "http://lol.inven.co.kr/dataninfo/counter/list.php?code=1" #카운터 번호 (ex> 아칼리 = 1)
resp = requests.get(test_url)
html = BeautifulSoup(resp.content, 'html.parser')
rel = html.find('div', {'class': 'champList'})
CounterChamp = str(rel).split('selectCounter')
del CounterChamp[0]
del CounterChamp[0]
for i in range(0,len(CounterChamp)):
if i % 2 == 0:
champName = CounterChamp[i].replace('(\'\');">','')
champName = champName.split('</a')[0]
print(champName)
CounterChampList_F.append(champName)
print("========================================")
champList에서 가져온 정보를 슬라이싱으로 가공해줍니다.
import requests,time
from bs4 import BeautifulSoup
champ = input('챔피언이름:')
ChampNumberSet = {'아칼리':'1',
'알리스타':'2',
'아무무': '3',
'애니비아' : '4',
'애니' : '5',
'애쉬' : '6',
'블리츠크랭크' : '7',
'블츠' : '7',
'브랜드' : '8',
'케이틀린' : '9',
'카시오페아' : '10',
'초가스' : '11',
'코르키' : '12',
'문도 박사' : '13',
'문도' : '13',
'이블린' : '14',
'이즈리얼' : '15',
'피들스틱' : '16',
'갈리오' : '17',
'갱플랭크' : '18',
'가렌' : '19',
'그라가스' : '20',
'하이머딩거' : '21',
'이렐리아' : '22',
'잔나' : '23',
'자르반 4세' : '24',
'자르반' : '24',
'잭스':'25',
'카르마':'26',
'카서스':'27',
'카사딘':'28',
'카타리나':'29',
'케일':'30',
'케넨':'31',
'코그모':'32',
'르블랑':'33',
'리 신':'34',
'리신':'34',
'럭스':'35',
'말파이트':'36',
'말자하':'37',
'마오카이':'38',
'마스터 이':'39',
'마스터이':'39',
'마이':'39',
'미스 포츈':'40',
'미스포츈':'40',
'미포':'40',
'모데카이저':'41',
'모데':'41',
'모르가나':'42',
'몰가':'42',
'나서스':'43',
'니달리':'44',
'녹턴':'45',
'누누와 윌럼프':'46',
'누누':'46',
'올라프':'47',
'판테온':'48',
'뽀삐':'49',
'람머스':'50',
'레넥톤':'51',
'럼블':'52',
'라이즈':'53',
'샤코':'54',
'쉔':'55',
'신지드':'56',
'사이온':'57',
'시비르':'58',
'소나':'59',
'소라카':'60',
'스웨인':'61',
'타릭':'62',
'티모':'63',
'트리스타나':'64',
'트타':'64',
'트런들':'65',
'트린다미어':'66',
'트린':'66',
'트위스티드 페이트':'67',
'트페':'67',
'트위스티드페이트':'67',
'트위치':'68',
'우디르':'69',
'우르곳':'70',
'베인':'71',
'베이가':'72',
'블라디미르':'73',
'블라디':'73',
'워윅':'74',
'신 짜오':'75',
'신짜오':'75',
'질리언':'76',
'레오나':'77',
'오리아나':'78',
'탈론':'79',
'오공':'80',
'요릭':'81',
'스카너':'82',
'리븐':'83',
'제라스':'84',
'그레이브즈':'85',
'쉬바나':'86',
'피즈':'87',
'볼리베어':'88',
'아리':'89',
'빅토르':'90',
'세주아니':'91',
'직스':'92',
'노틸러스':'93',
'피오라':'94',
'룰루':'95',
'헤카림':'96',
'바루스':'97',
'다리우스':'98',
'드레이븐':'99',
'제이스':'100',
'자이라':'101',
'다이애나':'102',
'렝가':'103',
'신드라':'104',
'카직스':'105',
'엘리스':'106',
'제드':'107',
'나미':'108',
'바이':'109',
'쓰레쉬':'110',
'퀸':'111',
'자크':'112',
'리산드라':'113',
'아트록스':'114',
'루시안':'115',
'징크스':'116',
'야스오':'117',
'벨코즈':'118',
'브라움':'119',
'나르':'120',
'아지르':'121',
'칼리스타':'122',
'렉사이':'123',
'바드':'124',
'에코':'125',
'탐 켄치':'126',
'탐켄치':'126',
'킨드레드':'127',
'일라오이':'128',
'진':'129',
'아우렐리온 솔':'130',
'아우렐리온솔':'130',
'탈리야':'131',
'클레드':'132',
'아이번':'133',
'카밀':'134',
'라칸':'135',
'자야':'136',
'케인':'137',
'오른':'138',
'조이':'139',
'카이사':'140',
'파이크':'141',
'니코':'142',
'사일러스':'143',
'유미':'144',
'키아나':'145',
'세나':'146',
'아펠리오스':'147',
'세트':'148',
'릴리아':'149',
'요네':'150',
'사미라':'151',
'세라핀':'152',
'렐':'153'
}
CounterChamp = []
CounterChampList = []
CounterChampList_F = []
test_url = "http://lol.inven.co.kr/dataninfo/counter/list.php?code=" + str(ChampNumberSet[champ]) #카운터 번호 (ex> 아칼리 = 1)
resp = requests.get(test_url)
html = BeautifulSoup(resp.content, 'html.parser')
rel = html.find('div', {'class': 'champList'})
CounterChamp = str(rel).split('selectCounter')
del CounterChamp[0]
del CounterChamp[0]
for i in range(0,len(CounterChamp)):
if i % 2 == 0:
champName = CounterChamp[i].replace('(\'\');">','')
champName = champName.split('</a')[0]
print(champName)
CounterChampList_F.append(champName)
print("========================================")
print(CounterChampList_F)
최종 크롤링 부분 코드입니다.
실행 결과입니다.
※여기 나오는 카운터는 모두 승률이나 패치를 감안하지 않고 인벤 글을 기준으로 찾은 것이기 때문에 부정확할 수 있습니다.※
!robots.txt 확인결과
:Wget을 제외한 봇의 접근을 허용하고 있습니다.
lol.inven.co.kr/robots.txt여기서 확인 가능합니다.
'프로그래밍 > 스크래핑' 카테고리의 다른 글
[Python] 주식 정보 자동화 (0) | 2020.10.23 |
---|---|
[Python] webdriver를 이용한 리로스쿨 크롤링 (0) | 2020.02.19 |
[Python] 네이버 영화 평 가져오기&데이터 분류 (0) | 2020.02.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 컨트롤타임
- 1252
- localstorage
- 코드설명
- 꿈두레
- 아나콘다
- 크롤링
- promise반환
- SMTP
- 1253
- pygame
- 바닐라 js
- 주석
- Codeup
- 문제풀이
- 코드업
- 티처블 머신
- 2022.02.05
- 바닐라 javascript
- JavaScript
- django
- 1251
- Python
- Anaconda
- 1254
- 사칙연산
- notion api
- 타이탄의도구들
- 1255
- 도전
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함