반응형
SMALL
■ 주피터 노트북으로 진행
■ 지난 포스트 이어서 진행
■ 필요 라이브러리 선언 및 헤더 리스트 세팅
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"}
# 정보를 담을 리스트 만들어주기
# 반복문 초기화를 시키지 않기 위해 밖에서 선언
number=[]
name=[]
position=[]
age=[]
nation=[]
team=[]
value=[]
■ 반복문들 통하여 2페이지까지 크롤링 및 데이터 세팅
- range 함수를 통하여 1,2 의 숫자를 만들어줌
- for 문을 통해 range 를 통해 생성 된 값을 i 라는 변수에 대입
for i in range(1,3):
// string formmat을 통하여 끝 부분에 i 변수를 넣어준다.
url = f"https://www.transfermarkt.com/
spieler-statistik/wertvollstespieler/marktwertetop?page={i}"
r = rq.get(url, headers=headers)
r.status_code
# 콘텐츠를 넣어준다
soup = bf(r.content,'html.parser')
# list 로 클래스명을 넘겨서 데이터 받아오기
player_info = soup.find_all('tr', class_=['odd', 'even'])
- 이중 for문을 통하여 데이터를 취득해준다.
- time.sleep() 을 통하여 한번의 로직 수행 후 프로그램 부하를 막기위해 1초 쉬어준다.
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을 통하여 앞뒤 공백제거
time.sleep(1)
■ pasdas 의 데이터프레임 메서드를 통하여 데이터 정의하기
방법 1. 딕셔너리 형태로 데이터 정의하기
df = pd.DataFrame({
"number" : number,
"name" : name,
"position" : position,
"age" : age,
"nation" : nation,
"team" : team,
"value" : value
})
방법 2. 메서드 호출 형태로 데이터 정의하기
df = pd.DataFrame(player_list, columns=["이름", "포지션", "나이", "국가","팀","선수 몸 값"])
■ to_csv 메서드를 통해 csv 로 떨궈주기
- csv : comma separated value
- shift + tap 을 통하여 메서드의 내부 파라미터를 조회 할 수 있다.
#파일이름을 첫번째 인자로 인덱스를 정의할 것에 대한 유무를 두번 째 인자로 정의한다.
df.to_csv('transfermakt50_use_before_init_list.csv', index=False)
■ 최종코드
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"}
# 정보를 담을 리스트 만들어주기
# 반복문 초기화를 시키지 않기 위해 밖에서 선언
player_list = []
for i in range(1,3):
url = f"https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop?page={i}"
r = rq.get(url, headers=headers)
r.status_code
# 콘텐츠를 넣어준다
soup = bf(r.content,'html.parser')
# list 로 클래스명을 넘겨서 데이터 받아오기
player_info = soup.find_all('tr', class_=['odd', 'even'])
# td 태그만 찾기
for info in player_info:
player = info.find_all('td') #player의ㅣ요소를 적절히 print하며 요소를 찾는다.
# number = player[0].get_text() # 각 인덱스 정보를 각 리스트에 .append
name = player[3].get_text()
position = player[4].get_text()
age = player[5].get_text()
nation = player[6].img['alt'] # 이미지태그안에 나라 값이 있으므로 태그로 찾기
team = player[7].img['alt']
value = player[8].get_text().strip() # stript을 통하여 앞뒤 공백제거
value = value[1:-1] # 특수 문자 제거
player_list.append([name,position,age,nation,team,value])
time.sleep(1)
df = pd.DataFrame(player_list, columns=["이름", "포지션", "나이", "국가","팀","선수 몸 값"])
# #csv 파일로 떨구기
# # csv : comma separated value
df.to_csv('transfermakt50_use_before_init_list.csv', index=False)
■ 떨군 csv 확인하기
number | name | position | age | nation | team | value |
1 | Jude Bellingham | Attacking Midfield | 20 | England | Real Madrid | €180.00m |
2 | Erling Haaland | Centre-Forward | 23 | Norway | Manchester City | €180.00m |
3 | Kylian Mbappé | Centre-Forward | 25 | France | Paris Saint-Germain | €180.00m |
4 | Vinicius Junior | Left Winger | 23 | Brazil | Real Madrid | €150.00m |
5 | Bukayo Saka | Right Winger | 22 | England | Arsenal FC | €130.00m |
6 | Phil Foden | Right Winger | 23 | England | Manchester City | €130.00m |
7 | Florian Wirtz | Attacking Midfield | 21 | Germany | Bayer 04 Leverkusen | €110.00m |
8 | Jamal Musiala | Attacking Midfield | 21 | Germany | Bayern Munich | €110.00m |
9 | Lautaro Martínez | Centre-Forward | 26 | Argentina | Inter Milan | €110.00m |
10 | Victor Osimhen | Centre-Forward | 25 | Nigeria | SSC Napoli | €110.00m |
11 | Declan Rice | Defensive Midfield | 25 | England | Arsenal FC | €110.00m |
12 | Rodri | Defensive Midfield | 27 | Spain | Manchester City | €110.00m |
13 | Harry Kane | Centre-Forward | 30 | England | Bayern Munich | €110.00m |
14 | Rodrygo | Right Winger | 23 | Brazil | Real Madrid | €100.00m |
15 | Federico Valverde | Central Midfield | 25 | Uruguay | Real Madrid | €100.00m |
16 | Martin Ødegaard | Attacking Midfield | 25 | Norway | Arsenal FC | €95.00m |
17 | Gavi | Central Midfield | 19 | Spain | FC Barcelona | €90.00m |
18 | Eduardo Camavinga | Central Midfield | 21 | France | Real Madrid | €90.00m |
19 | Julián Álvarez | Second Striker | 24 | Argentina | Manchester City | €90.00m |
20 | Aurélien Tchouaméni | Defensive Midfield | 24 | France | Real Madrid | €90.00m |
21 | Rafael Leão | Left Winger | 24 | Portugal | AC Milan | €90.00m |
22 | Bruno Guimarães | Defensive Midfield | 26 | Brazil | Newcastle United | €85.00m |
23 | Moisés Caicedo | Defensive Midfield | 22 | Ecuador | Chelsea FC | €80.00m |
24 | Pedri | Central Midfield | 21 | Spain | FC Barcelona | €80.00m |
25 | Gabriel Martinelli | Left Winger | 22 | Brazil | Arsenal FC | €80.00m |
26 | Enzo Fernández | Central Midfield | 23 | Argentina | Chelsea FC | €80.00m |
27 | Xavi Simons | Attacking Midfield | 21 | Netherlands | RB Leipzig | €80.00m |
28 | Khvicha Kvaratskhelia | Left Winger | 23 | Georgia | SSC Napoli | €80.00m |
29 | William Saliba | Centre-Back | 23 | France | Arsenal FC | €80.00m |
30 | Rúben Dias | Centre-Back | 27 | Portugal | Manchester City | €80.00m |
31 | Bernardo Silva | Attacking Midfield | 29 | Portugal | Manchester City | €80.00m |
32 | Lamine Yamal | Right Winger | 16 | Spain | FC Barcelona | €75.00m |
33 | Luis Díaz | Left Winger | 27 | Colombia | Liverpool FC | €75.00m |
34 | Josko Gvardiol | Centre-Back | 22 | Croatia | Manchester City | €75.00m |
35 | Dominik Szoboszlai | Central Midfield | 23 | Hungary | Liverpool FC | €75.00m |
36 | Nicolò Barella | Central Midfield | 27 | Italy | Inter Milan | €75.00m |
37 | Darwin Núñez | Centre-Forward | 24 | Uruguay | Liverpool FC | €70.00m |
38 | Alexis Mac Allister | Central Midfield | 25 | Argentina | Liverpool FC | €70.00m |
39 | Ronald Araujo | Centre-Back | 25 | Uruguay | FC Barcelona | €70.00m |
40 | Douglas Luiz | Central Midfield | 26 | Brazil | Aston Villa | €70.00m |
41 | Éder Militão | Centre-Back | 26 | Brazil | Real Madrid | €70.00m |
42 | Gabriel Jesus | Centre-Forward | 27 | Brazil | Arsenal FC | €70.00m |
43 | Alexander Isak | Centre-Forward | 24 | Sweden | Newcastle United | €70.00m |
44 | Christopher Nkunku | Attacking Midfield | 26 | France | Chelsea FC | €70.00m |
45 | Frenkie de Jong | Central Midfield | 27 | Netherlands | FC Barcelona | €70.00m |
46 | Alessandro Bastoni | Centre-Back | 25 | Italy | Inter Milan | €70.00m |
47 | Trent Alexander-Arnold | Right-Back | 25 | England | Liverpool FC | €70.00m |
48 | James Maddison | Attacking Midfield | 27 | England | Tottenham Hotspur | €70.00m |
49 | Bruno Fernandes | Attacking Midfield | 29 | Portugal | Manchester United | €70.00m |
50 | Leroy Sané | Right Winger | 28 | Germany | Bayern Munich | €70.00m |
LIST
'Programming > python' 카테고리의 다른 글
[ Python ] Mac에서 Pycharm, Conda 사용해서 FastApi 설치 및 테스트 (0) | 2024.05.20 |
---|---|
[ Python ] Pandas를 통해 데이터 정렬 및 메서드 사용해보기 (0) | 2024.05.19 |
[ Python ] requests, beautifulSoup 을 통하여 웹 크롤링 해보기 (0) | 2024.05.16 |
[ Python ] Requests, BeautifulSoup 기본 사용법 (0) | 2024.05.16 |
[ python ] pandas 에서 apply 함수 (0) | 2024.05.11 |