본문 바로가기
Work/개발

이미지, 텍스트 크롤링 및 저장 프로그램 만들기 (selenium, BeautifulSoup)

by 라리올리 2021. 11. 11.
반응형

블로그 글을 작성하기 위한 자료를 찾고 저장하는 것을 Python 크롤링 프로그램으로 만들어 보았습니다. 

카카오페이지의 작품 소개 내용을 긁어서 .txt파일로 떨구는 프로그램입니다. 

 

 

 

 

1. 프로그램 Flow

프로그램이 흘러가는 순서는 아래와 같습니다. 프로그램 만들 때 어떻게 작동하게 할지 흐름을 어느 정도 정리 한 뒤 개발하면 좀 더 빨리 개발 진행할 수 있습니다. 

1. 카카오 페이지에 접속하여 원하는 작품 검색하기
2. 해당 작품 조회 화면으로 이동
3. 작품소개 버튼 클릭하기
4. 작품소개글 복사하기
5. txt 파일로 저장하기

 

2. 프로그램 개요

접근 페이지 URL : https://page.kakao.com

사용 언어 : python 3.9.4 

사용 library : BeautifulSoup ,  selenium, urllib, time

 

3. BeautifulSoup , selenium 설치하기

pip install bs4
pip install selenium

혹시 pip 사용 방법을 모르신다면 Pywinauto로 파일 업로드 자동화 하기 - 2.Pywinauto 설치하기 글을 참고하시면 됩니다. 해당 포스팅은 pywinauto 설치를 설명하고 있는데, pywinauto 부분만 bs4 , selenium으로 변경하여 설치하시면 됩니다. 

 

BeautifulSoup은 HTML 문서를 분석할 수 있고, selenium는 webdriver를 통해 크롬을 제어합니다. 크롬 webdriver 설치방법은 chromedriver 설치하기포스팅에 따로 설명 해 두었으니, 필요하신 경우 읽어 보시면 좋을 것 같습니다. 

 

 

 

 

 

4. 프로그램 소스 코드

4-1. 카카오 페이지에 접속하기

from urllib.parse import quote_plus
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By

base_url = "https://page.kakao.com" 
search_url = "/search?word="
search_word = input('검색 작품명:')
kakao_home_url = base_url + search_url + quote_plus(search_word)
#검색어를 파싱하여 포함한 url

driver = webdriver.Chrome("chromedriver")
driver.get(kakao_home_url)

selenium의 webdriver를 통해서 크롬을 띄우고, 검색 작품 이름을 받아서, 해당 검색 값으로 url 오픈하는 코드입니다.

 

- 검색 결과 호출 url이나, 페이지 url의 공통 url 값은 base_url로 공통 변수 지정하여 사용하였습니다.

- 검색 작품 이름은 한국어로 입력받기 때문에 quote_plus로 파싱 처리하여 url에 붙였습니다.

- driver.get(url) 하면 해당 url 화면으로 크롬이 오픈 됩니다. 

 

4-2 해당 작품 조회 화면으로 이동

검색 결과 화면 html (크롬개발자 도구로 확인 할 수 있습니다.)

 

html = driver.page_source
soup = BeautifulSoup(html, features="html.parser")
mainContents = soup.select(".mainContents")

for mc in mainContents:
    # 해당 웹소설 list 화면
    list_url = base_url + mc.a.attrs['href']
    driver.get(list_url)

검색어가 입력된 url을 실행하면, 해당 결과의 목록 화면이 조회됩니다. BeautifulSoup을 통해 html로 파싱 처리합니다.

이때, F12로 해당 페이지 HTML을 보면 soup으로 어떤 class를 읽어야 할지 알 수 있습니다.

 

페이지를 열 때마다 변경되지 않는 변수를 찾아서 지정해야, 소스 수정 없이 프로그램을 사용할 수 있기에 어떤 class 내의 소스를 가지고 올지 정하는 부분도 중요합니다.

저는 maincontents라는 class가 변하지 않은 이름일 것 같아서 해당 부분으로 가지고 오도록 하였습니다.

 

검색 결과 화면 html을 보면,  <div class = 'maincontents' > 내에 <a href ="/home?=~~"라고 되어 있는 부분을 확인하실 수 있습니다. html을 보면 full url을 지칭하지 않아서, a.attrs ['href']로 url 뒷부분을 가지고 오도록 하고 base_url과 합쳐서 list url을 얻었습니다. 


4-3. 작품 소개 버튼 클릭하여 작품 소개글 데이터 담기

    driver.find_element(By.CLASS_NAME,'css-zkp4tp').click()
    time.sleep(1)
    contents_html = driver.page_source
    soup = BeautifulSoup(contents_html, features="html.parser")

작품 소개글은 소설 내 '작품소개' 버튼을 눌러야 html 로 데이터가 나와서 해당 버튼을 클릭한 뒤 생성된 html로 파싱하도록 하였습니다. layer가 뜨는 시간이 있어야 할 것 같아 time.sleep(1)을 주었습니다. 


4-4. 작품소개글 복사하기

    desc = soup.select_one(".descriptionBox").text

작품소개 글이 담겨있는 div의 class인 descriptionBox 내 text를 가지고 오도록 하였습니다. 이 html에서 해당 class가 하나인 경우라 select_one을 통해 하나만 가지고 오도록 처리하였습니다.


4-5. txt 파일로 저장하기

    with open(search_word+'.txt','w') as d:
        text = d.write(desc)

입력한 search_word 가 파일명인 txt 파일을 만들고, 가지고 온 작품 소개글을 해당 파일에 write 합니다. 

 

5. 결과물

해당 코드를 실행하면 입력한 작품 이름의 작품 소개글이 작품명. txt로 해당 코드와 같은 폴더 위치에 저장됩니다. 

 

 

 

반응형

댓글