Python/웹 스크래핑 및 웹 자동화
selenium 을 이용해 네이버 블로그 검색 결과에서 특정 블로그 게시물 랭킹 찾기
P_eli
2024. 2. 26. 14:43
728x90
반응형
Python과 Selenium을 사용하여 네이버 블로그 검색 결과 페이지에서 특정 블로그 게시물의 랭킹을 찾는 방법을 알아보겠습니다.
1. 필요한 라이브러리 import하기
먼저 필요한 라이브러리를 import합니다. Selenium과 관련된 모듈과 Chrome 드라이버를 자동으로 설치하기 위해 chromedriver_autoinstaller도 import합니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import chromedriver_autoinstaller
2. Chrome 드라이버 설치 및 인스턴스 생성
chromedriver_autoinstaller.install()을 사용하여 Chrome 드라이버를 자동으로 설치하고, webdriver.Chrome()을 통해 드라이버 인스턴스를 생성합니다.
chromedriver_autoinstaller.install()
driver = webdriver.Chrome()
3. 검색할 쿼리 설정 및 검색 링크 생성
검색할 쿼리를 설정하고, 해당 쿼리를 포함한 네이버 블로그 검색 링크를 생성합니다.
search_query = "python flask"
search_link = f"https://search.naver.com/search.naver?ssc=tab.blog.all&sm=tab_nmr&query={search_query}"
이 부분에서는 찾고자 하는 특정 블로그 게시물의 링크와 해당 게시물을 선택할 CSS 선택자를 설정합니다.
먼저 해당사이트에 HTML 태그를 확인해줍니다.
※ html 태그는 사이트마다 바뀌는 경우가 있으니 자주 확인해야 합니다.
확인결과 a태그 href 로 찾고자 하는 블로그 게시물 링크 를 선택 할 수 있습니다.
부모 ul 요소 및 하위 li 요소 찾기
확인결과 class 로 ul태그 와 li 태그 로 요소를 선택 할 수 있습니다.
4. 페이지를 스크롤하여 목표 링크 찾기 함수 정의
scroll_to_find_link() 함수를 정의하여 페이지를 스크롤하여 목표 링크를 찾습니다.
# 페이지를 스크롤하여 목표 링크를 찾는 함수 정의
def scroll_to_find_link(target_link):
while True:
last_height = driver.execute_script("return document.body.scrollHeight")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
try:
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, f'a[href^="{target_link}"]'))
)
break
except:
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
print("목표 링크를 찾지 못했습니다.")
break
last_height = new_height
5. 검색 결과 페이지 열기 및 목표 링크 찾기
검색 결과 페이지를 열고 목표 링크를 찾습니다.
driver.get(search_link)
target_blog_link = "https://seungkangmo.tistory.com/290"
scroll_to_find_link(target_blog_link)
6. 찾은 목표 링크 출력 및 위치 확인
찾은 목표 링크를 출력하고, 해당 링크가 검색 결과에서 몇 번째 항목인지 확인합니다.
try:
# 찾은 목표 링크 출력
element = driver.find_element(By.CSS_SELECTOR, f'a[href^="{target_blog_link}"]')
print("목표 링크를 찾았습니다:", element.get_attribute('href'))
# 해당 목표 링크가 ul 태그 안에 몇 번째 li인지 확인
li_elements = driver.find_elements(By.CSS_SELECTOR, 'ul.lst_view._fe_view_infinite_scroll_append_target > li.bx')
for index, li_element in enumerate(li_elements):
if element.find_element(By.XPATH, './ancestor::li') == li_element:
print("해당 목표 링크는 검색 결과 중", index + 1, "위 입니다.")
break
except NoSuchElementException:
print("목표 링크를 찾지 못했습니다.")
7. 브라우저 종료
작업이 끝나면 브라우저를 종료합니다.
driver.quit()
실행결과
찾았을때
못찾았을때
전체코드
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
import chromedriver_autoinstaller
# 크롬 드라이버 자동 설치
chromedriver_autoinstaller.install()
# 크롬 웹 드라이버 인스턴스 생성
driver = webdriver.Chrome()
# 검색할 쿼리 및 네이버 블로그 검색 링크 설정
search_query = "python flask"
search_link = f"https://search.naver.com/search.naver?ssc=tab.blog.all&sm=tab_nmr&query={search_query}"
# 페이지를 스크롤하여 목표 링크를 찾는 함수 정의
def scroll_to_find_link(target_link):
while True:
last_height = driver.execute_script("return document.body.scrollHeight")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
try:
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, f'a[href^="{target_link}"]'))
)
break
except:
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
print("목표 링크를 찾지 못했습니다.")
break
last_height = new_height
# 검색 결과 페이지 열기
driver.get(search_link)
# 검색 결과에서 목표 링크 찾기
target_blog_link = "https://seungkangmo.tistory.com/290"
scroll_to_find_link(target_blog_link)
try:
# 찾은 목표 링크 출력
element = driver.find_element(By.CSS_SELECTOR, f'a[href^="{target_blog_link}"]')
print("목표 링크를 찾았습니다:", element.get_attribute('href'))
# 해당 목표 링크가 ul 태그 안에 몇 번째 li인지 확인
li_elements = driver.find_elements(By.CSS_SELECTOR, 'ul.lst_view._fe_view_infinite_scroll_append_target > li.bx')
for index, li_element in enumerate(li_elements):
if element.find_element(By.XPATH, './ancestor::li') == li_element:
print("해당 목표 링크는 검색 결과 중", index + 1, "위 입니다.")
break
except NoSuchElementException:
print("목표 링크를 찾지 못했습니다.")
# 브라우저 닫기
driver.quit()
728x90
반응형