Python과 ChatGPT API를 활용한 자동화 로봇 개발

5_Python과 ChatGPT API를 이용한 블로그 자동화 프로그램 개발

atomicdev 2024. 8. 15. 16:10
728x90

강의 5: 티스토리 글에 공감 클릭하기 (웹 자동화)

목표

이 강의의 목표는 Selenium을 사용하여 티스토리 블로그의 글에 공감을 자동으로 클릭하는 방법을 학습하는 것입니다. 웹 크롤링 대신 Selenium을 사용해 브라우저를 자동으로 제어하고, 크롤링한 글 목록에서 공감 버튼을 클릭하는 과정을 구현합니다. 필요시 로그인 처리도 다루게 됩니다.

내용

  1. Selenium 소개
    • 웹 브라우저 자동화를 위한 도구: Selenium은 웹 브라우저를 자동화하는 도구로, 사람의 행동을 모방하여 웹 페이지를 제어할 수 있습니다.
    • Selenium 설치 및 기본 사용법: Selenium을 설치하고 기본적인 사용법을 배웁니다. Python에서 Selenium을 사용하여 웹 페이지를 탐색하고, 버튼을 클릭하는 등의 작업을 수행할 수 있습니다.
  2. 크롬드라이버 설정
    • 크롬드라이버 다운로드 및 설정: Selenium이 Chrome 브라우저를 제어할 수 있도록 크롬드라이버를 설치하고 설정합니다. 크롬드라이버는 Selenium이 브라우저와 상호작용할 수 있도록 도와주는 중간 다리 역할을 합니다.
  3. 티스토리 글에 자동으로 공감 클릭하기
    • 공감 클릭 구현: 크롤링한 글 목록을 순회하면서 각 글에 대해 공감 버튼을 클릭하는 과정을 Selenium을 통해 구현합니다.
    • 로그인 처리 (필요시): 공감 버튼을 클릭하기 위해 로그인 처리가 필요한 경우, Selenium을 통해 로그인 절차를 자동화합니다.

실습: Selenium을 이용해 공감 클릭하기

이제 위의 내용을 기반으로 실습을 진행해보겠습니다. 목표는 Selenium을 사용하여 특정 티스토리 글에 공감을 자동으로 클릭하는 것입니다.

ClickHeartDemo.ipynb 노트를 만들어서 작업 진행합니다. 

실습을 위해서

먼저 selenium 모듈을 설치해야 합니다. 설치를 위해 아래의 명령어를 실행해 주세요:

!pip install selenium

또한, webdriver_manager 패키지가 없을 경우, 이 패키지도 설치해야 합니다. 이를 설치하려면 다음 명령어를 실행하세요:

이후에 다시 Selenium 코드를 실행해보시면 됩니다. selenium과 webdriver_manager가 설치되면, 앞서 제공한 코드를 정상적으로 실행할 수 있습니다.

!pip install webdriver-manager

코드 예제

크롬드라이버를 이용해서 팝업창을 띄워 줍니다. 
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 크롬드라이버 설정 및 실행
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# 원하는 URL로 이동
url = "https://atomicdev.tistory.com/"
driver.get(url)
 위의 코드를 실행(Ctrl+Enter)시키면 아래와 같이 크롬창이 하나 뜨게 되는데 지금부터 이 창의 HTML을 크롤링해서 처리할 것이기 때문에 자동으로 창이 닫힐때까지 이 창을 절대로 닫으면 안됩니다.
새로운 Cell을 추가해서 공감(좋아요) 버튼을 찾아서 자동으로 클릭하는 함수를 만들어 줍니다.
def click_heart(driver, url):
    # URL로 이동
    driver.get(url)
    
    # 페이지 로드 대기
    time.sleep(2)  # 페이지가 로드되도록 잠시 대기
    
    try:
        # 좋아요(공감) 상태 확인
        like_button_container = driver.find_element(By.CSS_SELECTOR, 'div.uoc-icon')
        
        # 공감 버튼이 클릭된 상태인지 확인
        if "like_on" in like_button_container.get_attribute('class'):
            print(f"Already liked the post: {url}")
        else:
            # 공감 버튼 클릭
            like_button = driver.find_element(By.CSS_SELECTOR, 'div.uoc-icon')
            like_button.click()
            print(f"Clicked heart on: {url}")
    except Exception as e:
        print(f"Failed to click heart on: {url} - {e}")
 
아직 공감 체크가 되어있지 않은 임의의 글을 찾아 url 을 확인합니다. (예 : https://atomicdev.tistory.com/45, 가급적 다른 글의 url을 찾아서 입력해 주시기 바랍니다.)
새로운 Cell을 생성해서 위 url(https://atomicdev.tistory.com/45)의 공감 버튼이 자동 클릭될 수 있도록 click_heart 함수를 호출합니다.
click_heart(driver, 'https://atomicdev.tistory.com/45')
 
새로고침 후 페이지를 다시 확인하면 공감(좋아요) 가 클릭되어 있는것을 확인할 수 있습니다.
 
이 상태에서 해당글의 좋아요를 다시 클릭하도록 소스를 다시 실행하면 이미 좋아요가 클릭되었기 때문에 다시 클릭되지 않도록 프로그램에 반영되어 있습니다. 이 부분이 고려되있지 않다면 좋아요 선택이 취소될 것입니다.
 
크롬드라이버로 열린 크롬창을 찾아서 우측 상단의 아이콘을 클릭해서 로그인을 진행합니다.
 
로그인 후에 click_heart 함수를 다시 클릭하면 공감(좋아요)가 한번 더 실행되는 것을 확인할 수 있습니다.
 
공감(좋아요)가 2로 되어있는 것을 확인할 수 있는데 로그인전 비회원으로 클릭되고 로그인 후 회원으로 클릭되도록 되어 있는것을 확인할 수 있습니다.
 
이제 특정 일자 이후에 새로 작성된 모든 글 목록을 가져와서 loop를 돌면서 click_heart 를 호출할 수 있습니다.
import requests
from bs4 import BeautifulSoup
from datetime import datetime

# 티스토리 블로그 URL 설정
blog_url = "https://atomicdev.tistory.com"

# 웹 페이지 가져오기
response = requests.get(blog_url)

# 상태 코드 확인 (200은 성공을 의미)
if response.status_code == 200:
    # BeautifulSoup을 사용하여 HTML 문서 파싱
    soup = BeautifulSoup(response.content, 'html.parser')
    
    # 글 목록이 포함된 article 태그를 찾음
    articles = soup.find_all('article', class_='article-type-common')

    # 각 글의 제목, URL, 작성 날짜 추출
    for article in articles:
        title_tag = article.find('strong', class_='title')
        title = title_tag.get_text(strip=True)  # 글 제목
        url = article.find('a', class_='link-article')['href']  # 글 URL
        full_url = f"{blog_url}{url}"  # 전체 URL 생성
        date_str = article.find('span', class_='date').get_text(strip=True)  # 작성 날짜
        
        # 날짜를 datetime 객체로 변환
        date = datetime.strptime(date_str, "%Y.%m.%d")
        
        # 날짜 비교 (8월 15일 이후 작성된 글만 필터링)
        if date >= datetime(2024, 7, 10):
            # 추출한 정보 출력
            print(f"Title: {title}")
            print(f"URL: {full_url}")
            print(f"Date: {date_str}")
            print("-" * 40)
            click_heart(driver, full_url)
else:
    print(f"Failed to retrieve the blog page. Status code: {response.status_code}")
게시글 리스트를 가져와서 좋아요를 처리합니다.

 

새로운 Cell을 추가하고 아래 코드를 실행하면 크롬드라이버가 종료되면서 크롬창도 닫히게 됩니다.

# 브라우저 종료
driver.quit()

실습 설명

  1. Selenium 설치 및 설정
    • webdriver_manager 패키지를 사용해 크롬드라이버를 자동으로 설치하고 설정합니다.
    • 브라우저 창을 띄우지 않고 실행하는 headless 옵션을 사용하여 백그라운드에서 작업을 진행할 수 있지만 로그인 처리와 직관적 이해를 위해 여기서는 창을 띄우도록 합니다.
  2. 티스토리 로그인
    • 티스토리 로그인 페이지로 이동하여, 사용자의 ID와 비밀번호를 입력하고 로그인합니다.
    • 로그인 처리가 완료될 때까지 잠시 대기합니다.
  3. 공감 버튼 클릭
    • 크롤링한 글의 URL 목록을 순회하며 각 페이지로 이동합니다.
    • 각 페이지에서 공감 버튼을 찾아 클릭합니다. 클릭 후 잠시 대기하여 정상적으로 동작하는지 확인합니다.
  4. 브라우저 종료
    • 모든 작업이 완료된 후 브라우저를 종료합니다.

요약

이 강의를 통해 Selenium을 사용하여 웹 페이지를 자동으로 제어하는 방법을 배웠습니다. 특히 티스토리 블로그에서 로그인 처리를 자동화하고, 크롤링한 글 목록에서 공감 버튼을 클릭하는 과정을 구현했습니다. Selenium을 활용하면 다양한 웹 작업을 자동화할 수 있어, 반복적인 작업을 효율적으로 처리할 수 있습니다.

728x90