Python/파이썬 웹 크롤러
다음 카페 크롤링(2023년 업데이트)
컴닥
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()
데이터를 프린트 대신 원하는 형식으로 저장하면 됩니다.
반응형