l3khub.com

블로그스팟에 포스팅한 글이 네이버에서 제대로 검색되는지 자동으로 확인하기 (ChatGPT로 개발한 파이썬 프로그램 사용)

블로그스팟에 블로그를 개설한 후 열심히 포스팅을 하고 있지만, 너무나 적은 방문자 유입에 힘든 시간을 보내던 중, 내 글이 네이버에 제대로 노출이 되고 있는지 궁금해졌습니다. 이 글에서는 내 글의 색인여부를 ChatGPT를 활용해 자동으로 확인하는 방법을 알아보겠습니다.

내-글이-네이버에서-검색되는지-확인하기-썸네일

블로그스팟에 포스팅한 글이 네이버에서 제대로 검색되는지 자동으로 확인하기 (ChatGPT로 개발한 파이썬 프로그램 사용)



1. 내가 포스팅한 글이 검색이 잘 되고 있을까?

블로그스팟에 블로그를 개설한 후 열심히 포스팅을 하고 있지만, 방문객이 없어도 너무 없어 상심하던중, 검색사이트에서 내 글들이 제대로 노출이 되고 있는지 궁금해졌습니다. 구글, 네이버, 빙 등 여러 검색사이트 모두를 대상으로 확인을 하기에는 시간이 너무 걸릴 것 같아, 우선 방문객 유입이 조금 있는 네이버를 대상으로 포스팅 했던 모든 글에 대해서 색인이 되어 있는지 검색해 보기로 했습니다. 

그런데 포스팅한 글들이 제법 많이 쌓여 있어 수작업으로 하나씩 검색한다면 요즘 세상을 살아가는 사람이 아닌 것 같아, ChatGPT를 활용해서 포스팅한 글 모두를 자동으로 검색하는 파이썬 소스를 작성하였습니다. 이 글에서 그 과정을 상세히 설명하도록 하겠습니다. 

이 글은 블로그스팟 블로그를 이미 네이버 서치어드바이저에 등록하신 분들을 대상으로 하며, 아직 네이버 검색엔진에 등록하지 않으신 분들은 여기를 클릭하시면 등록방법을 확인하실 수 있습니다.

ChatGPT를 활용해 파이썬 소스를 개발하는 순서는 다음과 같습니다. 
  1. 블로그스팟 블로그에 작성된 모든 글의 제목과 링크를 축출합니다.
  2. 축출한 제목 하나하나를 네이버 검색창에 입력한 후 검색결과에 있으면 "O", 없으면 "X"로 표시합니다.
  3. 결과를 화면에 "순번, 제목, Status" 로 출력하고, 동시에 엑셀파일에도 저장합니다.

2. ChatGPT를 활용한 파이썬 소스 작성

위에서 말씀드린 것처럼 모든 파이썬 소스는 ChatGPT를 활용하여 작성하였습니다. (저는 Plus 사용자로 GPT-4를 사용하였습니다.)

그리고 네이버를 대상으로 자동화된 프로그램을 만드는데 있어 주의해야 할 점이 있는데, 네이버는 자동화된 검색 쿼리를 허용하지 않습니다. 따라서 이 소스는 참고용으로만 사용하시기 바랍니다. 

1) 파이썬으로 블로그스팟 블로그에 작성된 모든 글 축출하기

ChatGPT에 로그인 한 후 프롬프트에 아래와 같이 입력합니다. 
  • 프롬프트 : 블로그스팟 블로그에 있는 모든 글의 리스트를 제목, 주소 형식으로 blog.txt에 저장하는 파이썬 코드를 작성해 줘.
위의 실행결과는 아래와 같습니다.

ChatGPT를-활용해-블로그스팟-블로그-글-제목을-축출하는-파이썬-코드-작성

import feedparser

# 블로그스팟 블로그의 Atom 피드 URL
# your-blog-name 을 여러분의 블로그스팟 블로그 명으로 변경하세요.
blog_url = 'http://your-blog-name.blogspot.com/feeds/posts/default?max-results=500'

# feedparser를 사용하여 피드 파싱
feed = feedparser.parse(blog_url)

# blog.txt 파일을 쓰기 모드로 열기
with open('blog.txt', 'w', encoding='utf-8') as file:
    # 각 게시글에 대해
    for entry in feed.entries:
        # 제목과 URL 추출
        title = entry.title
        link = entry.link
        # 파일에 제목과 URL 쓰기
        file.write(f'{title}, {link}\n')

print('블로그 포스트 목록이 blog.txt 파일에 저장되었습니다.')

위의 파이썬 소스를 실행하기 위해서는 컴퓨터에 파이썬 개발 및 실행 환경이 구성되어 있어야 합니다. 만약 여러분의 컴퓨터에 파이썬 개발 환경이 설정되어 있지 않다면 파이썬 설치, Visual Code 설치 를 참고하세요.

그리고 pip install requests beautifulsoup4 feedparser 를 실행하여 필요한 라이브러리를 설치해야 합니다. 

2) 축출한 제목을 네이버에서 검색하기

ChatGPT 프롬프트에 아래와 같이 입력합니다. 
  • 프롬프트 : 블로그스팟 블로그에 있는 모든 글의 제목과 링크를 가져온 후에, 제목을 네이버에서 검색해서 검색결과에 "에 대한 검색결과가 없습니다." 라는 문구가 있을 경우 "색인되어 있지 않음" 이라고 출력하는 파이썬 소스를 작성해 줘.
위와 같이 프롬프트를 작성한 이유는 화면에 "에 대한 검색결과가 없습니다."가 표시되면 색인이 되어 있지 않다는 것을 확인할 수 있기 때문입니다.

ChatGPT가 작성해 준 파이썬 코드는 아래와 같습니다. 

네이버에서-제목으로-검색하는-파이썬-소스

import feedparser
import requests
from bs4 import BeautifulSoup

# 블로그스팟 블로그의 Atom 피드 URL
# your-blog-name 을 여러분의 블로그스팟 블로그 명으로 변경하세요.
blog_url = 'http://your-blog-name.blogspot.com/feeds/posts/default?max-results=500' # 네이버 검색 URL naver_search_url = 'https://search.naver.com/search.naver' # 필요한 헤더 설정 - User-Agent를 웹 브라우저로 가장 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } # feedparser를 사용하여 피드 파싱 feed = feedparser.parse(blog_url) # 각 게시글에 대해 네이버 검색을 수행 for entry in feed.entries: title = entry.title link = entry.link # 네이버에서 제목을 검색 params = {'query': title} response = requests.get(naver_search_url, headers=headers, params=params) if response.status_code == 200: # 응답에서 HTML 파싱 soup = BeautifulSoup(response.text, 'html.parser') # "에 대한 검색결과가 없습니다." 문구 찾기 if soup.find(text="에 대한 검색결과가 없습니다."): print(f'"{title}" 제목의 블로그 글이 색인되어 있지 않음.') else: print(f'"{title}" 제목의 블로그 글이 색인됨.') else: print(f'네이버 검색 실패: {response.status_code}')

위의 코드를 실행하면 결과가 화면에만 출력되기 때문에, 텍스트 파일로 저장하려면 소스를 수정해야 합니다. 이것도 ChatGPT에게 부탁해 보도록 하겠습니니다. 

ChatGPT 프롬프트에 아래와 같이 입력하면 결과를 blog.txt에 저장하도록 소스코드를 수정해서 작성해 줍니다. 
  • 프롬프트 : 결과를 blog.txt 로 저장하는 것으로 코드를 바꿔 줘
import feedparser
import requests
from bs4 import BeautifulSoup

# 블로그스팟 블로그의 Atom 피드 URL
# your-blog-name 을 여러분의 블로그스팟 블로그 명으로 변경하세요.
blog_url = 'http://your-blog-name.blogspot.com/feeds/posts/default?max-results=500' # 네이버 검색 URL naver_search_url = 'https://search.naver.com/search.naver' # User-Agent를 설정 (네이버가 요청을 브라우저에서 온 것으로 인식하도록 함) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } # feedparser를 사용하여 피드 파싱 feed = feedparser.parse(blog_url) # 결과를 저장할 파일 열기 with open('blog.txt', 'w', encoding='utf-8') as file: # 각 게시글에 대해 네이버 검색을 수행 for entry in feed.entries: title = entry.title link = entry.link # 네이버에서 제목을 검색 params = {'query': title} response = requests.get(naver_search_url, headers=headers, params=params) if response.status_code == 200: # 응답에서 HTML 파싱 soup = BeautifulSoup(response.text, 'html.parser') # "에 대한 검색결과가 없습니다." 문구 찾기 if soup.find(text="에 대한 검색결과가 없습니다."): status = '색인되어 있지 않음' else: status = '색인됨' else: status = '네이버 검색 실패' # 파일에 제목과 URL 및 상태 쓰기 file.write(f'"{title}", {link}, {status}\n') print('블로그 포스트 목록 및 색인 상태가 blog.txt 파일에 저장되었습니다.')

그런데 위의 소스를 실행하니 "네이버 검색 실패"가 너무 많이 나오는 것을 발견했습니다. 그래서 ChatGPT에 해결 방법이 있는지 물어보았더니 아래와 같이 적절한 답을 제시해 주었습니다. 
  • 프롬프트 : 위의 블로그스팟 관련 소스를 실행하면 "네이버 검색 실패" 가 너무 많이 나와. 다른 방법이 없을까?
발생한-문제를-ChatGPT에게-해결방법을-물어본-결과

ChatGPT 가 알려준 해결 방법대로 소스 코드에 적용해 달라고 요청하면 아래와 같이 훌륭하게 소스 코드를 수정해 줍니다. 
  • 프롬프트 : 위의 타임 릴레이와 예외 처리 강화를 반영한 전체 소스를 다시 작성해 줘
import feedparser
import requests
import time
from bs4 import BeautifulSoup

# 블로그스팟 블로그의 Atom 피드 URL
# your-blog-name 을 여러분의 블로그스팟 블로그 명으로 변경하세요.
blog_url = 'http://your-blog-name.blogspot.com/feeds/posts/default?max-results=500' # 네이버 검색 URL naver_search_url = 'https://search.naver.com/search.naver' # User-Agent를 설정 (네이버가 요청을 브라우저에서 온 것으로 인식하도록 함) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } # feedparser를 사용하여 피드 파싱 feed = feedparser.parse(blog_url) # 결과를 저장할 파일 열기 with open('blog.txt', 'w', encoding='utf-8') as file: # 각 게시글에 대해 네이버 검색을 수행 for entry in feed.entries: title = entry.title link = entry.link # 네이버에서 제목을 검색 params = {'query': title} # 요청에 실패할 경우를 대비한 예외 처리 try: response = requests.get(naver_search_url, headers=headers, params=params) response.raise_for_status() # 200 OK 코드가 아닌 경우에 에러를 발생시키기 # 응답에서 HTML 파싱 soup = BeautifulSoup(response.text, 'html.parser') # "에 대한 검색결과가 없습니다." 문구 찾기 if soup.find(string="에 대한 검색결과가 없습니다."): status = '색인되어 있지 않음' else: status = '색인됨' except requests.exceptions.HTTPError: status = '네이버 검색 HTTP 에러' except requests.exceptions.ConnectionError: status = '네이버 검색 연결 에러' except requests.exceptions.Timeout: status = '네이버 검색 시간 초과' except requests.exceptions.RequestException: status = '네이버 검색 요청 에러' # 파일에 제목과 URL 및 상태 쓰기 file.write(f'"{title}", {link}, {status}\n') # 네이버가 연속된 요청을 차단하지 않도록 타임 딜레이 추가 time.sleep(1) # 1초 대기 print('블로그 포스트 목록 및 색인 상태가 blog.txt 파일에 저장되었습니다.')

그런데 ChatGPT가 수정해 준 소스를 실행해 보니 예상과 달리 모두 "색인됨"으로 나오는 문제가 발생하였습니다. 소스 코드를 디버깅 해 보니 네이버에 검색 요청을 한 후 응답을 제대로 받지 못하는 것 같았습니다. 그래서 request 대신 selenium를 사용하도록 소스를 수정해 달라고 요청했습니다. 
  • 프롬프트 : 코드를 selenium 를 사용하는 것으로 바꿔 줘
selenium를-적용한-소스코드-변경

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
import time

# Selenium WebDriver 설정
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 브라우저 창이 안보이는 headless 모드
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(executable_path='[크롬 드라이버 경로]', options=options)

# 블로그스팟 블로그의 Atom 피드 URL
blog_url = 'http://your-blog-name.blogspot.com/feeds/posts/default?max-results=500'
driver.get(blog_url)

# 블로그 글 제목과 URL을 가져오기
posts = driver.find_elements(By.XPATH, "//entry//title")

# 결과를 저장할 파일
with open('blog.txt', 'w', encoding='utf-8') as file:
    for post in posts:
        title = post.text
        link = post.find_element(By.XPATH, ".//following-sibling::link").get_attribute('href')

        # 네이버 검색
        driver.get('https://search.naver.com/search.naver')
        search_box = driver.find_element(By.NAME, 'query')
        search_box.send_keys(title)
        search_box.send_keys(Keys.RETURN)
        
        time.sleep(2)  # 검색 결과 페이지 로딩 대기

        # 검색 결과 확인
        try:
            driver.find_element(By.XPATH, "//*[contains(text(), '검색결과가 없습니다')]")
            status = '색인되어 있지 않음'
        except NoSuchElementException:
            status = '색인됨'

        # 파일에 결과 쓰기
        file.write(f'"{title}", {link}, {status}\n')

        # 네이버 요청 제한을 피하기 위해 대기
        time.sleep(1)

driver.quit()
print('블로그 포스트 목록 및 색인 상태가 blog.txt 파일에 저장되었습니다.')

Selenium은 프로그램이 Chrome 브라우저를 제어하여 사용자의 요구에 따라 특정 작업을 수행하도록 만드는 도구입니다. 초기 설정에는 다양한 옵션이 있지만, 복잡성을 피하기 위해 여기에서는 기본 설정만을 사용하여 간단하게 적용하겠습니다.

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 브라우저 창이 안보이는 headless 모드
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(executable_path='[크롬 드라이버 경로]', options=options)

위의 소스 코드를 모두 삭제한 후 아래 코드로 대체합니다. 

driver = webdriver.Chrome()

그런데 위의 코드에서 또 한가지 개선을 해야 할 부분이 있습니다. 

"time.sleep(2) # 검색 결과 페이지 로딩 대기" 부분인데, 이렇게 하면 무조건 2초간 프로그램이 대기를 하게 됩니다. 우리가 원하는 효과는 네이버에서 제목으로 검색을 한 후 검색 결과가 나오면 바로 다음 코드를 실행하는 것인데, sleep 함수는 검색 결과가 나오는 것과 상관없이 무조건 2초를 멈추게 하기 때문에 프로그램의 효율을 떨어지게 합니다. 

그래서 검색결과가 나오면 바로 다음 코드를 실행할 수 있도록 프로그램을 수정할 필요가 있습니다. 
  • 프롬프트 : 검색 결과 페이지 로딩 대기는 time 함수를 쓰지 말고 wait.until 을 쓰는 것으로 바꿔줘
wait.until 함수를 사용하면 검색 결과가 나타날 때까지 프로그램이 자동으로 대기하며, 결과가 확인되는 즉시 다음 코드로 진행할 수 있습니다. 이는 time.sleep 함수를 사용하여 일정 시간을 무조건 기다리는 방식보다 더 효율적이며, 전체 프로그램의 실행 속도를 개선할 수 있습니다.

import feedparser
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, TimeoutException

# feedparser를 이용해 블로그의 포스트를 가져오는 함수
def get_blog_posts(blog_url):
    feed = feedparser.parse(blog_url)
    return [(entry.title, entry.link) for entry in feed.entries]

# Selenium WebDriver 설정
options = webdriver.ChromeOptions()
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)  # 최대 10초까지 대기 설정

# 블로그스팟 블로그의 포스트를 가져옴
# your-blog-name 을 여러분의 블로그스팟 블로그 명으로 변경하세요.
blog_url = 'http://your-blog-name.blogspot.com/feeds/posts/default?max-results=500'
posts = get_blog_posts(blog_url) i = 0 f = open('blog_no_such.txt', 'w', encoding='utf-8') # 결과를 저장할 파일 with open('blog.txt', 'w', encoding='utf-8') as file: for title, link in posts: # 네이버 검색 search_query = f'"{title}"' driver.get('https://search.naver.com/search.naver') search_box = driver.find_element(By.NAME, 'query') search_box.send_keys(search_query) search_box.send_keys(Keys.RETURN) # 검색 결과 페이지 로딩 대기 try: element_present = EC.presence_of_element_located((By.CSS_SELECTOR, 'div.api_subject_bx')) wait.until(element_present) try: driver.find_element(By.XPATH, "//*[contains(text(), '에 대한 검색결과가 없습니다.')]") status = 'O' except NoSuchElementException: status = 'X' f.write(f'{link}\n') except TimeoutException: status = '검색 결과 로딩 시간 초과' # 파일에 결과 쓰기 file.write(f'"{title}"|{link}|{status}\n') i = i + 1 print(f'{i:03} >>> {status} = {title}') print('블로그 포스트 목록 및 색인 상태가 blog.txt 파일에 저장되었습니다.') file.close() f.close() driver.quit()

3) 결과를 화면에 "순번, 제목, Status" 로 출력하고, 엑셀파일로 저장

위의 코드를 실행하면 네이버에서 검색이 됐는지를 확인한 후 결과를 blog.txt 파일에 저장을 합니다. blog.txt에 한 줄로 저장된 내용을 복사하여 엑셀에 붙여넣기를 한 후 Title, Link, Status로 구분하려면 엑셀에서 추가적인 작업이 필요합니다. 

축출한-블로그스팟-블로그의-데이터를-엑셀에서-분리함



그런데 가만히 생각을 해보니, txt 형식으로 저장을 할 것이 아니라, 처음부터 엑셀파일에 원하는 형식으로 저장을 하면 별도의 작업을 할 필요가 없지 않을까 라는 생각을 들었습니다.

이 과정은 프로그램을 사용하다가 개선 아이디어가 떠올라 ChatGPT에 프로그램을 수정해 달라고 했고, 방법은 아래와 같습니다. 
  • 프롬프트 : 아래 소스에서 .txt 로 저장하는 부분을 엑셀 파일로 저장할 수 있도록 수정해 줘. 엑셀에서 a열은 title, b열은 link, c열은 status 으로 해 줘.
ChatGPT에게-txt형식-대신-엑셀-형식으로-저장하는-소스-코드-작성-요청


프롬프트를 실행하면 ChatGPT가 아래와 같이 소스 코드를 수정해 줍니다. 

import feedparser
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, TimeoutException
from openpyxl import Workbook

# feedparser를 이용해 블로그의 포스트를 가져오는 함수
def get_blog_posts(blog_url):
    feed = feedparser.parse(blog_url)
    return [(entry.title, entry.link) for entry in feed.entries]

# Selenium WebDriver 설정
wait = WebDriverWait(driver, 10)  # 최대 10초까지 대기 설정

# 블로그스팟 블로그의 포스트를 가져옴
# your-blog-name 을 여러분의 블로그스팟 블로그 명으로 변경하세요.
blog_url = 'http://your-blog-name.blogspot.com/feeds/posts/default?max-results=500'
posts = get_blog_posts(blog_url) # 엑셀 워크북과 워크시트를 초기화 wb = Workbook() ws = wb.active ws.append(['Title', 'Link', 'Status']) i = 0 # 결과를 저장할 파일 for title, link in posts: # 네이버 검색 search_query = f'"{title}"' driver.get('https://search.naver.com/search.naver') search_box = driver.find_element(By.NAME, 'query') search_box.send_keys(search_query) search_box.send_keys(Keys.RETURN) # 검색 결과 페이지 로딩 대기 try: element_present = EC.presence_of_element_located((By.CSS_SELECTOR, 'div.api_subject_bx')) wait.until(element_present) # 검색 결과 확인 try: driver.find_element(By.XPATH, "//*[contains(text(), '에 대한 검색결과가 없습니다.')]")
status = 'O' except NoSuchElementException: status = 'X' except TimeoutException: status = '검색 결과 로딩 시간 초과' # 엑셀 파일에 결과 쓰기 ws.append(['"'+title+'"', link, status]) i = i + 1 print(f'{i:03} >>> {status} = {title}') # 엑셀 파일 저장 wb.save('blog_results.xlsx') print('블로그 포스트 목록 및 색인 상태가 blog_results.xlsx 파일에 저장되었습니다.') driver.quit()

위의 소스를 실행한 결과는 아래와 같습니다. 

코드를-실행한-결과-화면-출력

엑셀로-저장된-결과

개발이 완료된 파이썬 소스 코드를 실행하여 위의 엑셀파일에 저장된 것과 같이 네이버에서 검색되지 않는 내 글의 제목과 링크를 확인하셨다면 네이버 서치어드바이저에서 해당 링크를 수집요청 하시면 됩니다. 만약 네이버에서 검색이 되지 않는 글들이 많을 경우에는 아래 링크로 제공해 드리는 "블로그스팟 원클릭 검색엔진 색인요청" 글들을 참고하시면 도움이 많이 되실 겁니다. 


오늘은 ChatGPT를 활용해 내 글이 네이버에서 제대로 검색이 되는지 자동으로 알아보는 방법에 대해서 상세히 알아보았습니다. 프로그래밍 기초가 없으신 분들이 보기에는 조금 어려울 수 있지만 조금만 공부를 하신다면 충분히 이해하실 수 있으실 겁니다. 프로그래밍과 파이썬 및 개발환경 설정에 대해서 더 알아보고 싶으시다면 아래 링크를 클릭하셔서 확인하시기 바랍니다.













To Top