크롤링을 시도하다보면 분명 f12를 통해서 페이지검사를 실시했을 떄는 문제 없이 나오던 html형식이

request모듈을 사용해서 가져오면 파이썬 내에서 보이지않는 경우가 발생한다.

url = 'https://sports.news.naver.com/wfootball/index'

re = requests.get(url)
soup = BeautifulSoup(re.text, 'lxml')
soup.find_all('span','title')
[<span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                                 BBC 전문가 "손흥민 있으니 케인 팔아라" 2..
                             </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                                 '첼시 새 9번' 루카쿠 "경기장에서 증명해보이..
                             </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                                 황의조 이적료 137억!! 무조건 팔아야 하는 ..
                             </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                                 토트넘은 노났고, 맨시티는 절박해졌다 [달수네라..
                             </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                             
                             
                             21/22시즌 맨시티가 챔스 조별리그에서 만날 상대는?
                         </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                             
                             
                             무리뉴의 전사된 타미, 로마 개막전 승리 견인
                         </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                             
                             
                             밀란 GK 메냥, 선방만큼 돋보였던 롱패스
                         </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                             
                             
                             첼시 루카쿠, 홀드 업 플레이 장착해 왕으로 돌아왔다
                         </span>]

내가 선택한 부분은 분명 span태그의 title클래스를 가지는 녀석인데 soup과 requests를 이용한 결과에는 확인되지않는다.

 

 

이 경우에는 정확하지는 않지만 자바스크립트로 작성된 웹페이지여서 그렇다고 한다.

움직이는 페이지나 움직여야만, 사용자가 동작을 해야만 페이지의 정보를 보여줘서, 가져올 수 있어서 

동적크롤링이라고 생각하면 편하다.

 

동적크롤링을 위해서는 셀레니움모듈을 사용한다.

 

 

!pip install selenium

셀레니움을 다른 모듈과 같은 방식으로 설치하고

사용을 위해서는 웹드라이버 설치가 요구된다.

크롬브라우저의 우측상단 점세개 > 도움말 >크롬정보로 가면 

위와같이 크롬브라우저의 버전을 확인할 수 있다.

 

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 93, please download ChromeDriver 93.0.4577.15 If you are using Chrome version 92, please download ChromeDriver 92.0.4515.107 If you are using Chrome version 91, please download ChromeDriver 91.0.4472.101 For

chromedriver.chromium.org

위 사이트에 가서 자신의 버전과 가까운 크롬브라우저를 다운로드받으면 된다.

나는 92.0.4515.159 버전이기 때문에 ChromeDriver 92.0.4515.107를 다운했했다.

마지막 세자리를 제외하고 생각하는것이 편할 것이다.

그리고 자신의 버전보다 숫자가 높다면 호환이 문제가 생길 수 있기때문에 가까운버전을 선택하되 낮은 버전을 선택하는 것이 좋겠다.

 

다운을 완료했다면 압축을 해제하고 자신이 코딩할 파이썬 파일(.py , .ipynb )이 있는 폴더에 옮기면된다.

자신의 경로를 모르겠다면 

import os 
os.getcwd()

이렇게 입력하고 실행하면 현재 경로를 알려준다.

웹드라이버가 제 위치를 찾았다면 동적크롤링의 준비가 완료된  것이다. 

 

이제 아까와 같은 페이지를 셀레니움을 활용해 동적크롤링해보자.

 

url = 'https://sports.news.naver.com/wfootball/index'

options = webdriver.ChromeOptions()
options.add_argument('--headless') # 창 새로 띄우는 것 없이
options.add_argument('--disable-gpu') # gpu 사용안하겠다 괜한 오류나오니깐

browser = webdriver.Chrome(options=options)
browser.maximize_window()

browser.get(url)

soup = BeautifulSoup(browser.page_source,'lxml')
soup.find_all('span','title')
[<span class="title">[UCL PO 2차] PSV 에인트호번 vs 벤피카 MVP 코디 학포</span>,
 <span class="title">[UCL PO 2차] PSV에게 '제로'라고 답하는 블라호디모스</span>,
 <span class="title">[UCL PO 2차] '무리한 도전' 베리시무의 경고 누적 퇴장!</span>,
 <span class="title">이강인 이적 상황 급변...발렌시아와 계약 종료 협상 중</span>,
 <span class="title">'단 1분도 못 뛰었는데' 벤치 신세로 전락한 에이스, 솔샤르의 희망고문인가</span>,
 <span class="title">토트넘 팬들 속탄다...케인, 이적설 파동 속에 골프 삼매경</span>,
 <span class="title">"호날두 만나고 싶다" 손흥민 꿈 이루어지나…토트넘 이적설 화제</span>,
 <span class="title">토트넘, 233억 원에 파페 마타르 사르 영입 합의</span>,
 <span class="title">AI가 예측한 EPL 최종 순위는? 1위는 맨시티, 아스널은 8위?</span>,
 <span class="title"> PSV 에인트호번 vs 벤피카 MVP 코디 학포</span>,
 <span class="title"> PSV에게 '제로'라고 답하는 블라호디모스</span>,
 <span class="title"> '이해를 못한 것이냐? ' 극대노하는 제주스 감독</span>,
 <span class="title"> 골대 강타에 멘탈이 무너지는 자하비</span>,
 <span class="title"> 과한 욕심에 역습 찬스 놓치는 야렘추크</span>,
 <span class="title"> PSV 에인트호번 vs 벤피카 전반 주요장면</span>,
 <span class="title"> '무리한 도전' 베리시무의 경고 누적 퇴장!</span>,
 <span class="title"> 괴체의 테크닉, 기회를 놓치는 필립 막스</span>,
 <span class="title"> '아직 죽지 않았다' 벤피카의 돌격 대장 타랍!</span>,
 <span class="title"> 슈팅의 침묵을 깨는 필립 막스</span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                                 BBC 전문가 "손흥민 있으니 케인 팔아라" 2..
                             </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                                 '첼시 새 9번' 루카쿠 "경기장에서 증명해보이..
                             </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                                 황의조 이적료 137억!! 무조건 팔아야 하는 ..
                             </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                                 토트넘은 노났고, 맨시티는 절박해졌다 [달수네라..
                             </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                             
                             
                             21/22시즌 맨시티가 챔스 조별리그에서 만날 상대는?
                         </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                             
                             
                             '완전체로 돌아온' 루카쿠, 골-연계-몸싸움까지 다 보여주다
                         </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                             
                             
                             밀란 GK 메냥, 선방만큼 돋보였던 롱패스
                         </span>,
 <span class="title" onclick="clickcr(this, 'stb.txt', '', '', event);">
                             
                             
                             무리뉴의 전사된 타미, 로마 개막전 승리 견인
                         </span>]

일반 크롤링에서는 찾아볼 수 없었던 정보를 가져오고 있는 것을 확인할 수 있다.

+ Recent posts