반응형
SMALL
■ 주피터 노트북을 통해 실습 진행
■ https://www.transfermarkt.com 이라는 축구사이트 크롤링 예정
■ 라이브러리 임포트
1. 필요 라이브러리 임포트
• headers 및 url 변수 설정
# as 로 별칭을 지정할 수 있다.
import requests as rq
import pandas as pd
import time
from bs4 import BeautifulSoup as bf
headers = {"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"}
url = "https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop"
2. requests 를 통하여 페이지 html 구조 가져오기
• 크롤링 예정 사이트
http://"https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop"
■ reques를 통해 get 요청 및 콘텐츠 넣어주기
r = rq.get(url, headers=headers)
r.status_code
#output
200 # 200인 것을 확인할 것
--- 콘텐츠 넣기 ---
# 콘텐츠를 넣어준다
soup = bf(r.content,'html.parser')
■ 웹크롤링 실전
■ 사이트에 들어가 사이트 분석 및 필요 데이터 가져오기
1. 사이트 분석 및 필요 요소 가져오기
• 크롬 웹개발자 도구를 통해 사이트 분석
• 필자는 odd 와 even 클래스의 요소를 가져올 것
player_info = soup.find_all('tr', class_=['odd', 'even'])
2. 요소 확인하기
# 첫번째 요소 확인하기
print(player_info[0])
#output
<tr class="odd">
<td class="zentriert">1</td><td class=""><table class="inline-table"><tr>
<td rowspan="2"><a href="#"><img alt="Jude Bellingham"
class="bilderrahmen-fixed"
src="https://img.a.transfermarkt.technology/portrait/small/58167
8-1693987944.jpg?lm=1" title="Jude Bellingham"/></a></td><td c
lass="hauptlink"><a href="/jude-bellingham/profil/spieler/581
678" title="Jude Bellingham">Jude Bellingham</a></td></tr><tr>
<td>Attacking Midfield</td></tr></table></td><td class="zentr
iert">20</td><td class="zentriert"><img alt="England" class="flagge
nrahmen" src="https://tmssl.akamaized.......이하 생략
# 데이터 개수 확인
print("선수 개수 : ", len(player_info))
#output
선수 개수 : 25
3. 데이터를 넣어줄 빈 배열 선언 및 데이터 넣기
• print 함수를 통하여 사이트를 분석하며 요소를 넣을 것
• list 에 append 함수를 통하여 요소를 넣늗다 .
# 정보를 담을 리스트 만들어주기
number=[]
name=[]
position=[]
age=[]
nation=[]
team=[]
value=[]
# td 태그만 찾기
for info in player_info:
player = info.find_all('td') #player의ㅣ요소를 적절히 print하며 요소를 찾는다.
number.append(player[0].get_text()) # 각 인덱스 정보를 각 리스트에 .append
name.append(player[3].get_text())
position.append(player[4].get_text())
age.append(player[5].get_text())
nation.append(player[6].img['alt']) # 이미지태그안에 나라 값이 있으므로 태그로 찾기
team.append(player[7].img['alt'])
value.append(player[8].get_text().strip()) # stript을 통하여 앞뒤 공백제거
3. 적절히 print하여 데이터 확인하기
print(number)
#output
['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', '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', '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', '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']
print(name)
#output
['Jude Bellingham', 'Erling Haaland', 'Kylian Mbappé',
'Vinicius Junior', 'Bukayo Saka', 'Phil Foden', 'Florian Wirtz',
'Jamal Musiala', 'Lautaro Martínez', 'Victor Osimhen', 'Declan Rice',
'Rodri', 'Harry Kane', 'Rodrygo', 'Federico Valverde', 'Martin Ødegaard',
'Gavi', 'Eduardo Camavinga', 'Julián Álvarez', 'Aurélien Tchouaméni',
'Rafael Leão', 'Bruno Guimarães', 'Moisés Caicedo', 'Pedri',
'Gabriel Martinelli', 'Jude Bellingham', 'Erling Haaland', 'Kylian Mbappé',
'Vinicius Junior', 'Bukayo Saka', 'Phil Foden', 'Florian Wirtz',
'Jamal Musiala', 'Lautaro Martínez', 'Victor Osimhen', 'Declan Rice',
'Rodri', 'Harry Kane', 'Rodrygo', 'Federico Valverde', 'Martin Ødegaard',
'Gavi', 'Eduardo Camavinga', 'Julián Álvarez', 'Aurélien Tchouaméni', 'Rafael Leão',
'Bruno Guimarães', 'Moisés Caicedo', 'Pedri', 'Gabriel Martinelli']
print(nation)
#output
['England', 'Norway', 'France', 'Brazil', 'England', 'England', 'Germany',
'Germany', 'Argentina', 'Nigeria', 'England', 'Spain', 'England', 'Brazil',
'Uruguay', 'Norway', 'Spain', 'France',
'Argentina', 'France', 'Portugal', 'Brazil', 'Ecuador', 'Spain', 'Brazil']
print(value)
#output
['€180.00m', '€180.00m', '€180.00m', '€150.00m',
'€130.00m', '€130.00m', '€110.00m', '€110.00m', '€110.00m',
'€110.00m', '€110.00m', '€110.00m', '€110.00m', '€100.00m',
'€100.00m', '€95.00m', '€90.00m', '€90.00m',
'€90.00m', '€90.00m', '€90.00m', '€85.00m', '€80.00m', '€80.00m', '€80.00m']
LIST
'Programming > python' 카테고리의 다른 글
[ Python ] Pandas를 통해 데이터 정렬 및 메서드 사용해보기 (0) | 2024.05.19 |
---|---|
[ Python ] 불러온 데이터 csv 로 임포트 해보기 (0) | 2024.05.19 |
[ Python ] Requests, BeautifulSoup 기본 사용법 (0) | 2024.05.16 |
[ python ] pandas 에서 apply 함수 (0) | 2024.05.11 |
[ Python ] pandas 자주 쓰는 함수 (0) | 2024.05.10 |