본문 바로가기
Project

[마켓센싱] 셀레니움으로 다른 경쟁사 홈페이지 스크래핑(더보기 클릭, 새 탭으로 열기, id값 변화 오류들)

by aimaimee 2023. 5. 17.

230515, 230516

해당 홈페이지는 페이지 번호로 이동하는 이전 홈페이지와 다르게, 더보기(see more)를 클릭하면 추가로 15개씩 기사가 출력되는 형식의 홈페이지이다.

💡 스크래핑 방향 설정

- 필요한 날짜까지 한 번에 더보기를 클릭해서 기사목록을 펼쳐둔다 > 기사를 클릭해 들어간다 > 본문 스크래핑 > 원래 페이지로 돌아옴

- is_displayed()를 활용해 코드 작성 완료

# 더보기 버튼 클릭하는 요소
more_botton = driver.find_element(By.CSS_SELECTOR, '#newsloadmore')
for i in range(1, 5): # 4번 더보기 클릭하도록 설정
	time.sleep(3)
    if more_botton.is_displayed():
    	more_botton.click()

❗ 문제 상황 1. 본문 태그의 id 값이 계속 바뀜

- 처음 방법 : 기사 제목, 날짜, 본문을 따로 가져오려고 했으나, 본문 태그의 id 값이 각 기사마다 달라짐.

   - content cp_base 박스 > 제목(cp_PageTitle cp_base)/ 날짜, 본문(class = cp_HeadingText1 cp_base, id='기사마다 값변화')

- 본문 부분과 날짜를 구분해서 불러오려면 바뀐 값을 계속 적용해야 함

- 💡 좀 더 쉬운 방법으로, 뉴스 페이지 전체가 속한 태그로 (제목, 날짜, 본문)을 뭉쳐서 긁어온 후, 전처리를 한다.

- 본문이 속한 id = 'content cp_base'의 'p' 태그들로 불러오면 뉴스 페이지가 전체 다 불러와짐.

❗ 문제 상황 2. 더보기 목록이 중복되어 불러와짐

- 맨 처음 url을 불러와서 실행했을 때 뜨는 쿠키 설정을 클릭해줌 > 해결

❗ 문제 상황 3. 더보기 목록 초기화

- 기사를 클릭 > 본문 스크래핑 > 원래 페이지로 왔을 때, 펼쳐둔 더보기 목록들이 초기화됨

- 💡 미리 더보기 펼쳐둠 > 각 기사 클릭 시 새탭으로 열기, 창전환 > 스크래핑 > 새탭 닫고, 원래 탭으로 돌아옴

- 참고한 블로그 : https://blog.naver.com/boxinganny/222946257452 (완전 같은 상황이었음)

- 트러블1 : send_keys(Keys.CONTROL + Keys.RETURN)이 동작을 안함. => import가 제대로 안되었는지, 코드가 꼬였는지, 230516 다시 처음부터 실행하니 작동.

- 트러블2 : 처음 실행했을 때, 새탭에서 잘 열렸으나 두 번째 에러 => 새로 열린 탭으로 이동한 후, 처음 탭으로 돌아와지지 않았던 것. 그러면 driver.get(url) 코드도 동작을 하지 않는다. => switch_to.window(driver.window_handles[0])으로 처음 탭으로 이동하게 다시 실행 > driver.get(url) 후 다시 새탭 코드를 실행해서 해결

news_click = driver.find_element(By.XPATH, '경로') # 새탭에서 열 링크 요소

news_click.send_keys(Keys.CONTROL + Keys.RETURN)  # ctrl+enter로 새탭 열기
driver.switch_to.window(driver.window_handles[1]) # 새로 열린 탭으로 이동
    
스크래핑 중략
    
# 탭 닫기
driver.close()
# 처음 탭으로 이동하기
driver.switch_to.window(driver.window_handles[0])

❗ 전처리

- 통으로 스크래핑 해 온 뉴스(제목, 날짜, 본문)을 분리해줘야 함

- '\n' 을 기준으로 split 후, 첫번째 인덱스([0])를 제목, 두 번째 인덱스([1])를 날짜, 이후 인덱스([2:])를 본문으로 설정

- 본문은 불필요한 ''가 너무 많이 생기기 때문에, ''를 기준으로 join해줌.

 

Reference

- 스크롤 시 초기화 문제 해결 https://blog.naver.com/boxinganny/222946257452

- ActionChains(Keys.CONTROL + Key.RETURN 트러블 때 대안으로 찾아본 방법)나 기타 기능들이 설명이 잘 되어 있음 https://0433.tistory.com/41

- '파이썬 셀레니움 링크 클릭해서 새탭으로 열기' 유튜브 영상 https://youtu.be/NNnL1MkiwoM

댓글