ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다음 카페 크롤링(2023년 업데이트)
    Python/파이썬 웹 크롤러 2023. 11. 19. 15:58
    반응형

    * 지나친 크롤링은 서버에 무리를 줄 수 있으며, 계정 정지 처분을 받을 수 있습니다. 

    달라진 부분

    1. 다음 카페의 로그인 방식
    2. 셀레니움의 버전업
    3. 웹 드라이버 자동 설치

    설치 

    pip install selenium
    pip install webdriver-manager

     코드

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    
    # 크롬 드라이버 자동 설치
    from webdriver_manager.chrome import ChromeDriverManager
    
    # 브라우저 꺼짐 방지
    chrome_options = Options()
    chrome_options.add_experimental_option('detach', True)
    
    # 크롬 드라이버 자동 설치
    service = Service(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=chrome_options)
    
    driver.implicitly_wait(5)
    # driver.maximize_window()
    
    # https://cafe.daum.net/SoulDresser/FLTB/792429
    CAFE = 'SoulDresser'  # 카페 주소
    BOARD = 'FLTB'  # 게시판 주소
    PAGE_NUM = 2  # 크롤링할 페이지 수
    
    # 접속
    driver.get(f'https://m.cafe.daum.net/{CAFE}')
    
    # 카카오 로그인 선택
    login = driver.find_element(
        By.CSS_SELECTOR,
        '#mArticle > div > div > div > div.login_account > a')
    login.click()
    
    driver.implicitly_wait(5)
    
    # 아이디 입력
    kakao_id = input('카카오 아이디를 입력하세요 : ')
    id_ = driver.find_element(By.CSS_SELECTOR, '#loginId--1')
    id_.click()
    id_.send_keys(kakao_id)
    
    # 패스워드 입력
    kakao_pw = input('카카오 비밀번호를 입력하세요 : ')
    pw = driver.find_element(By.CSS_SELECTOR, '#password--2')
    pw.click()
    pw.send_keys(kakao_pw)
    
    # 로그인 버튼
    login = driver.find_element(
        By.CSS_SELECTOR,
        '#mainContent > div > div > form > div.confirm_btn > button.btn_g.highlight.submit')
    login.click()
    
    # 2단계 인증 대기
    input('2단계 인증을 확인하셨습니까?')
    
    driver.get(f'https://m.cafe.daum.net/{CAFE}/{BOARD}')
    for i in range(1, PAGE_NUM + 1):
        driver.implicitly_wait(10)
        items = driver.find_element(By.ID, 'slideArticleList').find_elements(By.TAG_NAME, 'li')
        for item in items:
            article = [
                item.find_element(By.TAG_NAME, 'a').get_attribute("href").split('/')[-1],
                item.find_element(By.CLASS_NAME, 'txt_detail').text,
                item.find_element(By.CLASS_NAME, 'username').text,
                item.find_element(By.CLASS_NAME, 'created_at').text,
                item.find_element(By.CLASS_NAME, 'view_count').text,
            ]
            print(article)
        next_page_num = i % 5 + 1
        if next_page_num != 1:
            next_page = driver.find_element(
                By.CSS_SELECTOR,
                f'#pagingNav > span:nth-child({next_page_num + 1})')
        else:
            next_page = driver.find_element(
                By.CSS_SELECTOR,
                '#mArticle > div.paging_board > a.btn_page.btn_next')
        next_page.click()

    데이터를 프린트 대신 원하는 형식으로 저장하면 됩니다. 

    반응형
Designed by Tistory.