파이썬 Selenium으로 크롤링하기 - 카카오페이지 웹소설 이미지 다운 받기

 파이썬으로 이것저것 해보다가 셀레니움(Selenium)이라는 패키지에 대해 알게 되어서 설치했는데요. 좀 복잡해 보여서 미루고 있었는데 이번에 사용 방법을 꼼꼼히 읽어보고 따라 해보니까 생각보다 어렵지 않더라고요. 크롤링을 할만한 사이트를 찾다가 저번에 웹소설 표지 다운로드하는 방법을 올렸던 카카오페이지의 요소들로 연습했습니다. 그냥 코드만 기록해도 되지만, 나중에 기억이 안 날 수도 있어서 헷갈리거나 어려웠던 것들에 대한 설명을 덧붙였어요.

※저장한 데이터를 배포할 경우 법적으로 처벌 받을 수 있습니다.

파이썬 크롤링 연습 - Selenium 사용하기.

 제가 코드를 하나하나 엄청 자세하게 설명한 건 아니라서 파이썬에 대해 기초적인 건 알고 있어야 하실 거예요.

 아래는 저번에 카카오페이지의 이미지 다운로드 방법을 올렸던 글 링크입니다. 마음에 드는 부분이나 표지 정도만 다운 받고자 해서 찾은 방법이에요. 한 번 읽어보시면 크롬의 개발자 도구를 어떻게 다루는지 알면 이해가 더 잘 되실 겁니다.

 이번에는 지난 글처럼 요소를 수정해서 하나씩 다운 받는 게 아닌, 프로그램 실행으로 원하는 만큼 한 번에 수집하는 방법이에요.
 일단 파이썬 설치 후에 pip로 selenium을 설치해주세요. 패키지 설치 방법은 아래 링크에 있는 글 확인하세요. 전 파이썬 3.7 사용 중입니다. 버전 3이상 사용하시면 별 차이는 없을 거예요.

 아래 블로그로 가서 브라우저에 맞는 selenium webdriver를 다운 받으세요. 제가 이번에 참고한 블로그입니다. 이름이 영문인데 한국 사이트예요. 목차 중에 'Install'에 있습니다. 설명에 나온 대로 다운 받으시면 됩니다.

 설명 중에 다운받은 드라이버 파일을 Python 파일과 같은 디렉토리에 두라고 하는데요. 보통 기본 경로에 파일을 저장하실 거예요. Shell에서 [File - Open]을 눌렀을 때 처음 뜨는 파일 경로를 찾아서 넣으시면 됩니다. 당연하지만 압축 푸셔야 합니다.

 일단 import로 셀레니움와 여러가지 필요한 것들을 가져옵니다.
import selenium
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
 추가로, 이미지를 다운로드하기 위해 urllib도 가져옵니다. urllib는 아마 파이썬에 기본으로 있는 표준 라이브러리일 거예요.
import urllib import urllib.request
 이제 카카오페이지에서 무료 웹소설을 하나 고릅니다. 아래 링크는 카카오페이지 메인입니다.

 1화로 들어가세요. 그리고 링크를 복사합니다. 아마 링크는 "https://page.kakao.com/viewer?productId=00000000"일 거예요. 소설마다 뒤에 있는 숫자가 다릅니다.

 다시 파이썬으로 돌아와서 복사한 링크를 URL이라는 변수에 집어 넣습니다.
URL = 'https://page.kakao.com/viewer?productId=00000000'

driver = webdriver.Chrome(executable_path='chromedriver') driver.implicitly_wait(time_to_wait=1) driver.get(URL)
 driver~ 코드는 아까 참고한 블로그에서 하라는 대로 작성한 것입니다. 전 time_to_wait를 1로 정했어요. 여기까지 적고 실행해 보시면 선택한 소설의 1화가 뜰겁니다.
 여기서 셀레니움이 어떻게 사용되는 함수인지 대충 감이 오실 거예요. 실제 사용자가 사이트에 접속한 것처럼 어디를 들어가서 뭘 클릭하는지를 코드로 작성할 수가 있습니다. 이제 클릭하는 순서를 정해주어야 해요.
 일단 처음에 나오는 약간 어두운 화면의 '정방향 넘김' 안내를 없애야 합니다. 그냥 어두운 화면의 아무 곳이나 누르면 사라지는데요. 이 어두운 화면이 있는 위치를 찾아서 클릭하게 만들면 됩니다.

 개발자 도구(크롬 단축키: F12)를 열어서 Select 툴로 요소를 찾아주세요. 이건 이전에 제가 올린 카카페 이미지 다운로드 방법을 보셨다면 뭔 소리인지 대충 아실 겁니다. 해당 요소에 대고 [마우스 우클릭 - Copy - Copy XPath]를 선택하세요.

XPath를 복사합니다.

 파이썬으로 돌아와서 다음과 같이 작성하고 붙여 넣습니다. 앞뒤로 작은따옴표 반드시 하셔야 해요.
first = driver.find_element_by_xpath('붙여 넣는 곳')
first.click()
 변수명.click()이 해당 요소를 클릭하라는 의미입니다.

 이제 이미지의 경로를 찾아 줍니다. 똑같이 XPath를 복사하고 파이썬에 다음과 같이 작성한 뒤에 붙여 넣습니다.
img = driver.find_element_by_xpath('붙여 넣는 곳')
src = img.get_attribute('src')
urllib.request.urlretrieve(src,'이미지 이름.png')
 이미지 이름에는 원하는 이미지 이름을 넣어주세요. 되도록이면 띄어쓰기를 안 하는 걸 추천합니다. 한글은 사용하셔도 돼요. 확장자는 PNG, GIF, JPG 등 아무거나 하시면 됩니다.
 여기까지 작성한 채로 실행하시면 아마 첫 페이지만 저장될 겁니다. 이제 다음 페이지로 넘기셔야 해요. 넘기려면 소설 이미지 오른쪽에 있는 '>'의 위치를 찾으면 되겠죠. '>'의 요소를 찾아서 XPath를 복사하고 파이썬에 다음과 같이 작성합니다.
next_page = driver.find_element_by_xpath('붙여 넣는 곳')
next_page.click()
 여기까지 진행하셨다면 다음과 같이 코드가 작성되었을 겁니다.

import selenium
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import urllib import urllib.request

URL = 'https://page.kakao.com/viewer?productId=00000000'

driver = webdriver.Chrome(executable_path='chromedriver')
driver.implicitly_wait(time_to_wait=1)
driver.get(URL)

first = driver.find_element_by_xpath('붙여 넣는 곳')
first.click()

img = driver.find_element_by_xpath('붙여 넣는 곳')
src = img.get_attribute('src')
urllib.request.urlretrieve(src,'이미지 이름.png')

next_page = driver.find_element_by_xpath('붙여 넣는 곳')
next_page.click
 이 상태로 실행하면 첫 페이지(표지)가 다운로드 된 후에 다음 페이지로 넘어갑니다.
 반복문 작성을 위해 페이지 수를 찾아 볼 건데요. 페이지 수는 소설 이미지 아래쪽에 표시되어 있죠. 첫 페이지 보시면 '1 / 30'처럼 전체 페이지가 적혀 있습니다. 해당 부분의 요소를 찾은 뒤 XPath를 복사해서 아래에 붙여 넣습니다.
page_info = driver.find_element_by_xpath('붙여 넣는 곳')
page_num = page_info.text.replace("1 / ", "")
 두 번째 줄은 전체 페이지 수만 남기기 위한 코드입니다. 이걸 가지고 반복문을 작성하시면 됩니다. 반복할 때는 표지를 제외하고 다운로드 되도록 할 겁니다. 그럼 위의 코드와 달리 페이지를 넘기는 것부터 실행이 되어야겠죠.
 그리고 중요한 건 파일 이름에도 페이지 수를 넣으셔야 이미지 이름이 겹치지 않습니다. 예를 들어 (src, 'img%d.png'%page)이런 식으로 작성하셔야 img1, img2, img3 이런 식으로 저장됩니다.
 설명이 너무 복잡하네요. 아무튼 이런 방식으로 반복문을 작성해서 '다음편' 버튼을 누르는 것까지 작성하시면 해당 소설의 1화부터 원하는 화까지 다운 받으실 수 있습니다. 아마 읽다가 귀찮아서 관두거나 아래로 쭉 내리신 분도 있을 것 같네요. 아래는 제가 완성한 코드입니다. 일부러 복사 안 되게 했습니다. 직접 작성해보시길 바래요!


import selenium
import urllib
import urllib.request
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

URL = 'https://page.kakao.com/viewer?productId=00000000'

driver = webdriver.Chrome(executable_path='chromedriver')
driver.implicitly_wait(time_to_wait=1)
driver.get(URL)

name = '이미지 이름'
ep_num = 10    #몇 화까지 받을 것인가

for ep in range(0, ep_num):
    first = driver.find_element_by_xpath('붙여 넣는 곳')
    first.click()

    page_info = driver.find_element_by_xpath('붙여 넣는 곳')
    page_num = page_info.text.replace("1 / ", "")

    for page in range(1, int(page_num)):
        next_page = driver.find_element_by_xpath('붙여 넣는 곳')
        next_page.click()    #표지를 넘기기 위해 다음 페이지로 넘기기부터.

        img = driver.find_element_by_xpath('붙여 넣는 곳')
        src = img.get_attribute('src')
        urllib.request.urlretrieve(src,'%s%03d_%02d.png'%(name,ep+1,page))

    next_ep = driver.find_element_by_xpath('붙여 넣는 곳')
    next_ep.click()
    driver.implicitly_wait(time_to_wait=1)


 실행하면 이미지 이름은 '이름001_01.png', '이름001_02.png', '이름001_03.png', ...로 저장됩니다.
 혹시 문제가 된다면 코드는 내리겠습니다.

 복잡해서 공부하는 걸 미뤘는데 신기하네요. 다양하게 응용할 수 있을 것 같습니다.

댓글 쓰기

0 댓글