1. 실행시간 단축
- 기존의 크롤링 파일에서 입력한 만큼 선수 리스트를 작성하는 데 있어서 불필요하게 시간을 잡아먹는 부분이 있었다.
- 페이지 당 25명의 선수를 보여주므로 68명의 선수를 보고 싶을 땐 3페이지까지 총 75명의 선수를 크롤링 했었다.
이 때 75명의 모든 정보를 크롤링한 뒤 가공하고 슬라이싱을 거쳤는데, 그 전에 슬라이싱하는 방법을 선택했다.
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
player_info = soup.find_all('tr', class_ = ['odd','even'])
for info in player_info:
player = info.find_all("td")
number = player[0].text
name = player[3].text
position = player[4].text
age = player[5].text
nation = player[6].img['alt']
team = player[7].img['alt']
value = player[8].text.strip()
player_list.append([number, name, position, age, nation, team, value])
time.sleep(1)
# 구간 나누기 - 시간 단축
player_list = player_list[0:list_num]
- 하지만 페이지 단위로 모든 태그를 가져오기 때문에 숫자가 많아질 때 여전히 시간이 오래 걸린다.
1-2. 실행시간 단축 : find_all의 limit 속성 부여
- beautifulsoup의 find_all 메서드의 limit 속성을 사용하면 가져오는 태그의 개수에 제한을 할 수 있다.
- 크롤링하는 마지막 페이지에서 남아있는 선수 만큼만 태그를 가져와야 한다.
# 마지막 페이지에서 limit 설정
if i == ceil(list_num/25):
limit_count = list_num % 25 # 마지막 페이지의 남은 개수
player_info = soup.find_all('tr', class_ = ['odd','even'], limit = limit_count )
else :
player_info = soup.find_all('tr', class_ = ['odd','even'])
2. 선택조건 항목 추가 - BootStrap
- BootStrap을 사용하여 정렬 조건 항목을 추가하였다.
- 포지션 별로 선수 리스트를 가져올 수 있으며 골키퍼, 수비수, 미드필더, 공격수 네 가지 항목으로 나뉘어진다.
- 기본 설정은 전체이다.
3. 문제 해결
- 포지션 값에 따라 다른 url을 넘겨줘야 하는 상황에서 조건문을 사용할 경우 코드가 너무 길고 반복되는 부분이
많이 생겼고, 이를 간결하게 활용할 방법이 필요했다. - 다행히 트랜스퍼마켓 사이트에 포지션 별로 보여주는 차트가 존재했고 이를 적극 활용하였다.
- 각 포지션마다 url의 주소 중 한 부분이 달랐고, 이는 독일어로 포지션을 뜻했다.
ex 골키퍼 : /ausrichtung/Torwart/ , Torwart는 문지기라는 독일어이다. - 즉 각각의 url의 포지션에 해당하는 부분을 딕셔너리로 만들어 입력받은 포지션에 해당하는 key로 하여 특정 value에 접근하게 하였다.
pos_dict = {'AL':"alle",'GK':"Torwart",'DF':"Abwehr",'MF':"Mittelfeld",'FW':"Sturm"}
pos_value = pos_dict.get(position)
for i in range(1, ceil(list_num/25)+1):
url = f'https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/
marktwertetop/plus/ajax/yw1/ausrichtung/{pos_value}/spielerposition_id/alle/
altersklasse/alle/jahrgang/0/land_id/0/kontinent_id/0/yt0/Show/0//page/{i}'
# if position == "GK":
# url = f"https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop/plus/ajax/yw1/ausrichtung/Torwart/spielerposition_id/alle/altersklasse/alle/jahrgang/0/land_id/0/kontinent_id/0/yt0/Show/0//page/{i}"
# elif position == "DF":
# url = f"https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop/plus/ausrichtung/Abwehr/spielerposition_id/alle/altersklasse/alle/jahrgang/0/land_id/0/kontinent_id/0/yt0/Show/0//page/{i}"
# elif position == "MF":
# url = f"https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop/plus/ausrichtung/Mittelfeld/spielerposition_id/alle/altersklasse/alle/jahrgang/0/land_id/0/kontinent_id/0/yt0/Show/0//page{i}"
# elif position == "FW":
# url = f"https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop/plus/ausrichtung/Sturm/spielerposition_id/alle/altersklasse/alle/jahrgang/0/land_id/0/kontinent_id/0/yt0/Show/0//page{i}"
# else :
# url = f"https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop?ajax=yw1&page={i}"
- html에서 POST로 받아온 postion 값을 딕셔너리의 key값으로 하여 해당 value에 접근하는 방식이다.
훨씬 코드가 간결하고 불필요한 반복문을 사용을 안 할 수 있었다. - 처음엔 List를 사용하려고 했지만 포지션 코드 값에 따라 접근할 수 있고, 코드의 가독성을 생각하여 딕셔너리 자료구조를 사용하는 것이 낫다고 판단하였다.
'사이드 프로젝트 > 축구선수 몸값 웹 크롤링' 카테고리의 다른 글
축구선수 몸값 분석 웹 크롤링 (10) - 나이순 정렬 기능, 알림 창(JS) 추가 (0) | 2022.07.19 |
---|---|
축구선수 몸값 분석 웹 크롤링 (9) - 결과표 html 템플릿 만들기 (0) | 2022.07.18 |
축구선수 몸값 분석 웹 크롤링 (7) - 선수 국적 정보 출력 (0) | 2022.07.13 |
축구선수 몸값 분석 웹 크롤링 (6) - Bootstrap으로 html 꾸미기 (1) | 2022.07.12 |
축구선수 몸값 분석 웹 크롤링 (5) - 선택조건 체크박스 추가 및 데이터 처리 (0) | 2022.07.11 |