python/크롤링

[파이썬 크롤러] 셀레니움을 이용한 크롤링[2]

끼발자 2021. 7. 29. 10:40
반응형

2021.07.22 - [python] - [파이썬 기초] 셀레니움을 이용한 크롤링

 

[파이썬 기초] 셀레니움을 이용한 크롤링

이번 포스트에서는 Selenium을 이용한 크롤러를 제작 해 보겠다. bs4를 이용한 크롤러는 아래 링크 확인. 2021.07.21 - [python] - [파이썬 기초] 웹 크롤러 만들기 설치 pip install selenium 이전 포스트에서 셀

kkiho.tistory.com

이전 포스트에서 셀레니움 기초에 대해서 알아봤다.

 

이 포스트에서는 셀레니움에서 사용하는 옵션? 들을 다뤄보도록 하자.

 

1. 스크롤 다운

    def scroll_down():
        last_height = driver.execute_script("return document.body.scrollHeight")
        cnt = 0
        while cnt < 180:
                cnt += 1
                driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
                #time.sleep(3) # 필수사항은 아님
                new_height = driver.execute_script("return document.body.scrollHeight")
                if new_height == last_height:
                    break
                last_height = new_height

내 크롤러에서 webdriver 변수는 driver이다. 

위 함수에서 driver라고 적혀있는 변수들은 driver = webdriver.Chrome()에서 정의된 변수이니,

만약 당신이 다른 변수로 명명했다면 해당 변수만 바꿔주면 된다.

 

driver.get()을 이용하여 페이지를 열고 저 함수를 호출하면 맨 아래로 내려간다.

 

때때로, 스크롤을 내리면 더 많은 정보가 표시되는 페이지들이 있다.

그럴 때, time.sleep을 조절해서 반복문 도는 속도를 늦춰 끝까지 다 볼 수 있게 코딩하면 된다.

 

2. 수치 입력

수치 입력은 간단한 예제로 대체해보자.

from selenium import webdriver
driver = webdriver.Chrome(PATH)
driver.get('https:naver.com')

여담이지만, url을 입력할 때, 슬래시 없이도 들어가진다.

네이버 화면이 정상적으로 출력되는가?

그럼 로그인을 시도해보자.

NAVER 로그인 이라는 버튼의 XPath를 알아내보자.

어떻게 XPath를 알 수 있는지 궁금하다면. 이전 포스트를 참고하자.

driver.find_element_by_xpath(XPATH).click()

이렇게 xpath의 element를 구하고 바로 click()을 입력해주면 해당 기능을 수행해준다.

 

이 화면이 나타나면, 아이디와 비밀번호, 로그인 버튼에 해당하는 XPath를 구해보자.

그리고

ID = YourID
PW = YourPW

id_textbox = driver.find_element_by_xpath(ID_XPath)
pw_textbox = driver.find_element_by_xpath(PW_XPath)

id_textbox.send_keys(ID)
pw_textbox.send_keys(PW)

driver.find_element_by_xpath(LOGIN_XPATH).click()

자. 이렇게하면 로그인이 된다.

면 좋겠지만, 2021 07 29 기준으로 자동로그인은 안된다.

자동입력 방지장치가 적용되어있어서 수기로 입력해야한다.

규모가 큰 사이트들은 로그인에 이렇게 자동 로그인 방지장치를 넣으니 유의해두자.

 

전하고자 했던 바는 xpath를 이용하여 send_keys로 텍스트를 입력하고 제출할 수 있다는 것.

 

추가적으로 textbox에 send_keys를 이용하여 항목을 추가했다면, textbox.submit()을 통해서 제출도 가능하다.

 

3. Headless

자 다음은 headless이다.

사실 셀레니움 개발 초기단계에는 어떤식으로 작동하는지 봐야하므로, 창을 띄워놓는게 좋고

로컬에서 작업할 때는 직접 볼 수 있지만 만약 서버에서 크롤러를 동작해야한다면 참 난해하다.

그럴때 쓰이는 옵션이 headless옵션인데. 화면을 띄우지 않고 bs4처럼 통신한다고 생각하면 쉽다.

적용하는 방법은

from selenium.webdriver.chrome.options import Options

option = Options()
option.add_argument('headless')

...
driver = webdriver.Chrome(PATH, chrome_options=option)

위 코드만 갖다 붙이면, 셀레니움이 동작하면서 페이지가 뜨지 않는다.

반응형