논문 Impact factor를 수집할 때 JCR 이라는 사이트에서 확인 할 수 있는데 로그인을 해야 JCR 사이트를 이용할 수 있었다. 따라서, 셀레니움 프로그램 내에서 자동으로 로그인을 하여 수집하는 방향으로 진행하였다. JCR 사이트를 이용하기 위해서는 계정이 필요하므로 미리 계정을 생성하여 준다.




1. 홈페이지 html dom 분석

셀레니움을 통하여 자동화 할 내용은 다음과 같다.

  1. JCR 로그인 페이지 접속
  2. 아이디 입력 폼에 아이디 입력
  3. 비밀번호 입력 폼에 비밀번호 입력
  4. Stay signed in 체크박스 체크
  5. 로그인 버튼 눌러서 로그인하기


먼저 수집기를 만들기전에 수집 하고자하는 홈페이지의 html 구조 분석이 필요하다. 구글에 JCR을 검색하여 홈페이지에 들어가면 바로 로그인 창으로 넘어간 화면이 뜬다. 셀레니움 프로그램에서 아래의 url을 통해 JCR 홈페이지에 접속할 것이다.

  • JCR 접속 url : https://error.incites.thomsonreuters.com/error/Error?DestApp=IC2JCR&Error=IPError&Params=DestApp%3DIC2JCR&RouterURL=https%3A%2F%2Flogin.incites.thomsonreuters.com%2F&Domain=.thomsonreuters.com&Src=IP&Alias=IC2


크롬 개발자 도구(맨 오른쪽 점 3개짜리 버튼->도구더보기->개발자 도구)

를 켜고 select an element 버튼을 이용하여 각 요소별 html 구조 분석이 가능하다.
select an element 버튼은 이미지에서 파란색으로 표시된 버튼이다. 이 버튼을 누르고 html 요소를 클릭하면 html 파일에서 이 요소가 있는 위치로 이동해서 보여준다.


먼저 개발자 도구를 이용하여 아이디 폼의 구조를 확인해보면 이름이 username 인 것을 알 수 있다.


xpath라는 xml 구조도 찾을 수 있는데 찾은 html 위치에서 오른쪽클릭 -> copy -> copy xpath를 클릭하면 자동으로 클립보드에 복사되고 ctrl+c로 붙여넣기 하면 사용할 수 있다. 또한 여기서 이 요소의 css selector 값도 구할 수 있다.


정리하면 아이디 input 폼의 이름은 username 이고 xpath의 값은 //*[@id="username"] 이다.

비밀번호 input 폼도 동일한 방법으로 확인하면 이름은 password 이고 xpath의 값은 //*[@id="password"] 이다.

Stay signed in 체크박스 input 폼의 이름은 rememberme 이고 xpath의 값은 //*[@id="rememberme"] 이다.

로그인 버튼인 Sign in 버튼은 이름은 존재하지 않고 xpath의 값은 /html/body/div/div[1]/div[3]/div[1]/div/div/div/form[1]/button 이다.

수집한 정보를 이제 셀레니움 코드에 적용해보자.

2. 셀레니움 코드 작성

이전 포스팅에서 작성했던 코드에서 시작하면 driver.get() 부분에 접속하고자 하는 url로 변경해주어 접속한다. name이 존재하는 element들(아이디, 비밀번호 입력 폼)은 find_element_by_name 함수로 접근 할 수 있고 로그인 버튼은 find_element_by_xpath 함수로 접근할 수 있다. 코드는 아래와 같다.

from selenium import webdriver

options = webdriver.ChromeOptions()

# headless 옵션 설정
options.add_argument('headless')
options.add_argument("no-sandbox")

# 브라우저 윈도우 사이즈
options.add_argument('window-size=1920x1080')

# 사람처럼 보이게 하는 옵션들
options.add_argument("disable-gpu")   # 가속 사용 x
options.add_argument("lang=ko_KR")    # 가짜 플러그인 탑재
options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36')  # user-agent 이름 설정

# 드라이버 위치 경로 입력
driver = webdriver.Chrome('./chromedriver.exe', chrome_options=options)

# url을 이용하여 브라우저로 접속
driver.get('https://error.incites.thomsonreuters.com/error/Error?DestApp=IC2JCR&Error=IPError&Params=DestApp%3DIC2JCR&RouterURL=https%3A%2F%2Flogin.incites.thomsonreuters.com%2F&Domain=.thomsonreuters.com&Src=IP&Alias=IC2')

driver.implicitly_wait(3)

# 아이디/비밀번호를 입력해준다.
driver.find_element_by_name('username').send_keys('아이디 입력')
driver.find_element_by_name('password').send_keys('비밀번호 입력')

# stay signed in 체크박스 채우기(클릭)
driver.find_element_by_name('rememberme').click()

# 로그인 버튼을 누르기
driver.find_element_by_xpath('/html/body/div/div[1]/div[3]/div[1]/div/div/div/form/button').click()

# 로그인 된 화면 캡처
driver.get_screenshot_as_file('capture.png')

driver.quit()

오른쪽 상단에 보면 아이디로 로그인 된 것을 확인 할 수 있다.




reference
  • https://beomi.github.io/2017/02/27/HowToMakeWebCrawler-With-Selenium/
  • https://wkdtjsgur100.github.io/selenium-xpath/