본문 바로가기

Developer/Develop

selenium 으로 크롤링 하기 - selenium의 기초 크롤러 만들기

Selenium이란?

Selenium(셀레늄)은 웹 애플리케이션 테스트를 위한 포터블 프레임워크이다. 웹 크롤링을 할 때, 사용하기 편리하다.

 

 

<Selenium 설치>

selenium을 설치하기 위해서는 두가지 방법이 있습니다.

pip install selenium

위와 같이 cmd 창을 통해 해당 project가 생성되어 있는 폴더에 들어가서 설치하는 방법이 있다.

[File]-[Settings]에 들어가면 위와 같은 창이 뜬다. 오른쪽에 +를 누른다.

 

selenium을 검색해서 아래 Install Package 버튼을 눌러도 설치할 수 있다.

 

<ChromeDriver 설치>

https://sites.google.com/a/chromium.org/chromedriver/downloads

해당 사이트에 들어가면 설치할 수 있다.

Current Releases라고, 여러 파일들이 있고, 파란 글자를 누르면 운영체제에 맞게 다운로드 할 수 있다.

 

윈도우 기반으로 개발을 진행하므로, chromedriver_win32.zip을 다운로드 한다.

해당 파일을 다운로드하고, zip파일 압축을 풀어준다.

잠시 후, 소스를 짤 때, 해당 파일의 경로가 필요합니다. 따라서 저는 기억하기 쉽게 파이썬 프로젝트가 있는 파일로 chromedriver 파일을 옮겼습니다.

따라서, chromedriver의 경로는 C:\Users\userpc\PycharmProjects\chromedriver 입니다.

 

 

여기서 중요한 점이 하나 있습니다.

크롤링하고 있는 현재 창을 보면서 진행할 수가 있고, 창을 닫아놓은채로 진행할 수 있습니다.

이 때, 중요한 점이, 창을 보면서 진행하기 위해서는 chromeDriver와 현재 본인이 사용하고 있는 chrome의 버전이 같아야합니다.

chrome 버전 확인을 위해서는 chroome의 오른쪽 상단을 보면 점 3개가 있는걸 보실 수 있습니다.

[점3개 클릭]-[도움말]-[Chrome정보]를 클릭하시면, Chrome의 버전을 볼 수 있고, ChromeDriver와 Chrome의 버전이 다르다면 Chrome 업데이트 버튼을 클릭하여 업데이트를 진행해주시기 바랍니다.

 

이제 Selenium 크롤링을 위한 기본 준비는 끝마쳤습니다.


<Selenium 크롤링 - Driver 연결>

from selenium import webdriver

#다운받았던 chromedriver의 위치를 입력하면 됩니다.
driver = webdriver.Chrome(r'C:\Users\userpc\PycharmProjects\chromedriver.exe')

경로 앞에 r을 입력하면, \이 입력되지 않는 경우를 방지할 수 있으므로, r을 입력하시길 권장드립니다.

 

from selenium import webdriver

driver = webdriver.Chrome(r'C:\Users\userpc\PycharmProjects\chromedriver.exe')

driver.implicitly_wait(2)

driver.implicitly_wait(2)는 driver가 연결되도록 잠시 기다려주는 시간입니다.

해당 코드를 실행하면 data;라는 url을 가진 빈 화면의 chrome 창이 하나 뜰겁니다.

그렇다면 chromedriver 연결에 성공했습니다.

 

<selenium 크롤링 - url 연결>

이제 특정 url에 연결해보겠습니다.

from selenium import webdriver

driver = webdriver.Chrome(r'C:\Users\userpc\PycharmProjects\chromedriver.exe')

driver.implicitly_wait(2)

driver.get('https://daum.net')

해당 소스를 실행하면 아까처럼 새로운 chrome 창이 하나 뜨고, https://daum.net에 연결되는걸 눈으로 확인할 수 있습니다.

driver.get(url)의 url에 본인이 연결하고 싶은 url을 입력하면, 해당 사이트로 이동할 수 있습니다.


 

해당 사이트에 로그인 하기 위해,

1) 메인화면에서 파이썬 소스로 로그인 클릭 후 로그인 진행하는 방법,

2) 로그인 창을 띄워서 로그인을 진행하는 방법 두 가지 모두 진행하겠습니다. 

같은 방법이지만 1)에서는 메인화면에서 카카오계정 로그인을 클릭하는 과정이 있으므로, 먼저 설명드린 후에, 로그인 하는 과정을 보여드리겠습니다.

 

먼저, 메인화면에서 파이썬 코드를 짜서, 로그인창으로 넘어가보겠습니다.

코드를 알아보기 위해 F12 를 통해 개발자 모드로 들어가보겠습니다.

왼쪽 위에 네모안에 화살표가 있는 모양을 누르시고, 소스의 위치를 알고싶은 곳을 클릭하면 해당 부분의 소스를 바로 알 수 있습니다.

저는 카카오 계정 로그인으로 진행하겠습니다.

해당 부분의 소스에서 마우스 오른쪽 클릭 후, [copy]-[copyxpath]를 선택하시면 click을 진행할 수 있습니다.

driver.get('https://daum.net')
driver.find_element_by_xpath('//*[@id="inner_login"]/a[2]').click()

copyxpath 후, driver.find_element_by_xpath()에 본인이 카피한 xpath를 입력하고, click() 메소드를 입력합니다.

소스를 실행하면 [새로운 크롬 창 생성]-[다음 창]-[카카오 계정 로그인 클릭] 하는 과정을 눈으로 보실 수 있습니다.

 

<아래부터는 1번과 2번의 진행과정이 같습니다>

 

로그인 화면에서도 마찬가지로, 개발자 도구를 통해 [마우스 오른쪽 클릭]-[copy]-[copyxpath]를 합니다.

driver.get('https://daum.net')
driver.find_element_by_xpath('//*[@id="inner_login"]/a[2]').click()

login = driver.find_element_by_xpath('//*[@id="loginEmailField"]/div/label')
login.clear()
login.send_keys("*************")

xpath에는 본인이 복사한 xpath를 입력하고, login.send_keys()안에는 본인이 로그인할 계정을 넣습니다.

같은 방법으로 비밀번호도 입력합니다.

 

driver.get('https://daum.net')
driver.find_element_by_xpath('//*[@id="inner_login"]/a[2]').click()

#카카오 계정 입력
login = driver.find_element_by_xpath('//*[@id="loginEmailField"]/div/label')
login.clear()
login.send_keys("*************")

#비밀번호 입력
login = driver.find_element_by_xpath('//*[@id="id_password_3"]')
login.clear()
login.send_keys("*************")

복사한 xpath를 입력 후, login.send_keys()에는 로그인할 비밀번호를 입력합니다.

비밀번호 입력 후 로그인 버튼을 클릭해야겠죠??

 

동일한 방법으로 로그인 버튼의 xpath를 복사 후,

driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[8]/button').clck()

를 추가한 후 실행하면, 로그인까지 진행되는걸 볼 수 있습니다.

 

from selenium import webdriver

driver = webdriver.Chrome(r'C:\Users\userpc\PycharmProjects\chromedriver.exe')

driver.implicitly_wait(2)

driver.get('https://daum.net')
driver.find_element_by_xpath('//*[@id="inner_login"]/a[2]').click()

login = driver.find_element_by_xpath('//*[@id="loginEmailField"]/div/label')
login.clear()
login.send_keys("*************")

login = driver.find_element_by_xpath('//*[@id="id_password_3"]')
login.clear()
login.send_keys("*************")

driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[8]/button').clck()

최종 소스입니다.

 

driver.find_element_by_xpath 외에, find_element_by_id 로도 진행할 수 있습니다.

find_element_by_id의 경우에는 div의 ID를 명확하게 알 수 있는 경우에는 무리없이 사용할 수 있지만, ID가 명확하지 않은 사이트들이 있습니다.

그래서 저는 xpath를 이용하여 진행했습니다.


<크롤링 진행하기>

메인 화면의 헤드라인 기사를 수집해보겠습니다.

해당 페이지의 source를 수집하기 위해, beautifulSoup를 이용해야합니다.

먼저,

from bs4 import BeautifulSoup

를 입력합니다.

 

html = driver.page_source

html에 해당 사이트의 source를 넣습니다.

 

html = driver.page_source

soup = BeautifulSoup(html, 'html.parser')

headlines = soup.select('#realestate > div.news_prime > div')

 

[copy]-[copyselector']를 진행하여 soup.select에 입력합니다.

driver.get('https://daum.net')
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
headlines = soup.select('#news > div.news_prime.news_tab1.\#newsbox.\#news1 > div > ul')

for headline in headlines:
    print(headline.text)

headlines는 list 형식으로 저장되어있으므로, print를 진행하면,

제목만 가져온걸 콘솔 창에서, 눈으로 볼 수 있습니다.