별거별거닷컴 키워드비교 자동화

엥케이·2021년 1월 21일
0

별거별거닷컴

목록 보기
1/1

시작

상품의 키워드를 결정하기 위해 레드키워드와 블루키워드를 적절히 사용해야 한다고 배웠다(나도 1인 기업가 수업)
레드키워드와 블루키워드의 차이는 경쟁값(사이트수/월간검색수<0.9면 블루키워드)에 있다. 월간검색수는 네이버검색의 키워드도구에서 그 값을 얻을 수 있고, 사이트수는 네이버쇼핑에서 그 값을 얻을 수 있다.
이때, 비교할 키워드 수가 많으면 하나하나 일일이 수동으로 적어줘야 한다. 이를 자동으로 해보고 싶었다.
“내 일을 바꾸는 업무 자동화”에서 “11번가 검색 결과 정리하기”의 예제코드를 활용할 예정이다.

# auto_web_11st.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('chromedriver')

try:
    driver.get('http://11st.co.kr')

    elem = driver.find_element_by_class_name('search_text')
    elem.send_keys('자전거')
    elem.send_keys(Keys.RETURN)

    from openpyxl import Workbook
    result_xlsx = Workbook()
    worksheet = result_xlsx.active
    worksheet.append(['상품명', '가격'])

    elems = driver.find_elements_by_xpath("//ul[contains(@class, 'c_listing_view_type_list')]/li")
    for elem in elems:
        title_tag = elem.find_element_by_class_name('c_prd_name')
        # print(title_tag.text)
        price_tag = elem.find_element_by_xpath('.//div[@class="c_prd_price"]//span[@class="value"]')
        print(title_tag.text, price_tag.text)
        worksheet.append([title_tag.text, price_tag.text])

    file_name = 'C:\\python\\examples\\2.6\\11st_result.xlsx'
    result_xlsx.save(file_name)

    from my_email import send_mail
    send_mail('이태화', 'alghost.lee@gmail.com', '테스트', file_name)
except Exception as e:
    print(e)
finally:
    driver.quit()    

코드를 돌려볼 필요가 있어 터미널을 열었는데, 코드가 있는 폴더가 한글로 되어 있어 그 폴더로 프롬프트를 이동시키는 것도 막막했다. 배송정보 추출파일을 실행하는 것처럼 영어로 된 폴더로 파일을 복사해서 쓰려면 또 finder창을 2개 열어놓고 하려니 막막했다. 그래서 생각해낸 것이 심볼릭링크를 이용해 폴더를 쉽게 접근할 수 있게하는 것이었다. 구분을 쉽게 하기위해 우선 ".bash_profile"을 조금 손 보아 색깔로 파일,폴더,링크등을 구분할 수 있게 하였다. 근데 막상 ln명령을 쓰려고 하니 폴더이름을 한글로 입력해야하는데 여전히 잘 되지 않았다.
검색해 보니 MacOS의 터미널에서 쓰는 셸인 bash의 버전 문제라고 한다. 3.2.57이었는데 최신버전은 5.1였다. Homebrew로 버전업을 하면 된다고 하는데, 설치도 안되어 있어 다시 망설였다. 검색을 하다가 MacOS에서는 bash보다 zsh을 기본으로 지원한다는 기사를 보았다.
이 참에 권장하는 zsh을 설치해보자는 마음으로 zsh을 설치하는 중.

아래는 참고한 사이트다.
https://velog.io/@hwang-eunji/터미널꾸미기-Oh-my-zsh-테마-그-밖에-추가-설정MacOS
https://memoming.com/11
https://richwind.co.kr/125

zsh과 oh my zsh을 설치했는데, 한글폴더 이동뿐만 아니라 그 폴더에서 python3의 실행도 가능하다. 전에는 안돼서 python3의 문제인지 알았는데, 셸의 설정 문제였던 것 같다.
우여곡절 끝에 python code를 실행해 보니 시작은 잘 된다. 이제 code와 관련된 문제만 해결하면 된다는 말. 우선 selenium 라이브러리를 깔아야 한다.1 그리고 크롬드라이버도 받아야 한다. 크롬드라이버를 brew로 까는 법도 있지만2 우선 책에 나온대로 홈페이지에서 다운 받아 쓰도록 하겠다.
다했지만 문제가 있었다. 실행권한 문제가 있는 것 같아서 sudo도 써봤지만 안됐다. 그래서 finder에서 프로그램을 한 번 열어서 권한을 주고(?정확히는 모르지만 그럴 것 같다.) 다시 터미널에서 실행하니 제대로 되었다!!!

잠깐만!

그런데 생각해 보니 auto_web_11st.py는 selenium, openpyxl, xpath, my_email.py등을 사용해야 한다. 지금 이 일에는 selenium과 openpyxl만 다뤄도 충분할 것 같다.
한꺼번에 하려고 하지말고 단계적으로 해보자.

먼저 과정을 정의해보자

  1. 키워드 하나 정하기
  2. 키워드 도구에 입력 (schick으로 로그인)
  3. 연관키워드와 데이터(월간검색수)를 엑셀파일로 다운로드
  4. 그 엑셀파일에서 연관키워드 하나씩 뽑아서
  5. 네이버쇼핑(shopping.naver.com)에서 그 검색어를 입력해서 전체쇼핑몰 수를 추출한다.
  6. 각 연간키워드마다 전체쇼핑몰수/월간검색수 값을 구한다.

그럼 이제 단계를 나눠보자

1~3단계까지는 우선 수동으로 하고, 4~6단계를 자동화해보자. 이 경우

  • 1~3단계에서 나온 엑셀파일이 하나 준비하고
  • 네이버쇼핑에 연관키워드 하나를 검색어로 입력해서 해당하는 전체쇼핑몰수를 추출한다.
  • 전체쇼핑몰수를 엑셀파일에 있는 월간검색수로 나눠 경쟁값을 계산한다.
  • 각 연관키워드 마다 이를 반복하여 다른 엑셀에 기록한다.

의 자동화가 필요하다.

2020.1.25 우선 급한대로 완성

책에 나오는 여러코드들을 짜깁기하여 기능은 완성했다. selenium, openpyxl, xpath를 이용했다. list index out of range에러가 계속 나는 것이 문제.

from selenium import webdriver                                      # 라이브러리 load
from selenium.webdriver.common.keys import Keys                     # 라이브러리 load

from openpyxl import load_workbook, Workbook                    # 라이브러리 load
result_xlsx = Workbook()                                        # 엑셀파일에 쓸 클래스 만들기
worksheet = result_xlsx.active
##worksheet.append(['연관키워드', '월간검색수', '전체쇼핑몰수'])           # 이 줄이 에러가 자꾸 나서 아래 3줄을 실행
worksheet['A1']='연관키워드'
worksheet['B1']='월간검색수'
worksheet['C1']='전체쇼핑몰수'
worksheet['D1']='경쟁값'                                       # 경쟁값 = 전체쇼핑몰수/월간검색수

try:
    driver = webdriver.Chrome('./chromedriver')

    src_file_name = 'aaaa.xlsx'
    src_xlsx = load_workbook(src_file_name)                           # 파일 읽기 
    src_sheet = src_xlsx.active
    row_count = src_sheet.max_row

    rel_keyword_list = src_sheet['A']                               # 연관키워드를 한꺼번에 가져온다. r_k_l[0]~

    for row_index in range(1,row_count):

        m_srch_cnt_PC = str(src_sheet.cell(column=2, row=row_index+1).value)               # s.cell(1,1)~
        m_srch_cnt_PC_s = m_srch_cnt_PC.replace(',', '')

        m_srch_cnt_mobile = str(src_sheet.cell(column=3, row=row_index+1).value)    # 셀의 값이 정수일 경우를 대비해 string으로 변환
        m_srch_cnt_mobile_s = m_srch_cnt_mobile.replace(',', '')        

        m_srch_cnt = int(m_srch_cnt_PC_s) + int(m_srch_cnt_mobile_s)

        driver.get('https://shopping.naver.com')

        elem_q = driver.find_element_by_name('query')
        elem_q.send_keys(rel_keyword_list[row_index].value)
        elem_q.send_keys(Keys.RETURN)

        elems = driver.find_elements_by_xpath("//ul[contains(@class, '3yvWP')]")
        total_sites_num = elems[0].find_element_by_xpath("//span[contains(@class, '2x0jq')]")

        s = total_sites_num.text
        total_sites_num_s = s.replace(',', '')
        print(total_sites_num.text, total_sites_num_s)

        comp_val = float(total_sites_num_s)/m_srch_cnt

        print(rel_keyword_list[row_index].value, m_srch_cnt, total_sites_num_s, comp_val)
        worksheet.append([rel_keyword_list[row_index].value, m_srch_cnt, total_sites_num_s, comp_val])

except Exception as e:
    print(e)
finally:
    driver.quit()

file_name = 'shopping_naver_result.xlsx'
result_xlsx.save(file_name)

list index out of range의 이유!!!

25일 월요일 밤부터 26일 새벽까지 알아 보았다.
원래의 생각은 찾고자 하는 항목의 class가 일시적 변경되어 찾지 못하게 되는 바람에 이 에러가 발생한다고 생각하고 있었다. 하지만 만약 그렇다면 다시 프로그램을 실행했을 때는 어떻게 원래대로 돌아갈까하는 생각은 하지 못했다. 결론적으로는 class의 변경은 없었고 다른 이유가 있었다.
어쨌든 위 에러가 나면 프로그램을 다시 시작하면 되었기에, 처음의 해결 방향은 에러가 났을 때 주소를 다시 치고(driver.get) 검색을 하면 될 것 같았다. 그래서 try-except-finally 구문의 예를 좀 보고 기존의 try구문 안에 t-e-f를 넣어 주었다. 하지만 새로운 error message만 얻었다. 요소를 초기화해야 한다고 해서 XXX.clear()도 써 보았지만 차이가 없었다.

Message: stale element reference: element is not attached to the page document

이 내용으로 검색하니 time.sleep([초])나 time.sleep(random.uniform([초1,초2)])로 극복이 된다고 하였으나 조금 더 오래갈 뿐 여전히 같은 error들이 생겼다(import time과 import random필요). 하지만 놀라운 화면을 보게 되었다!!!!

지금의 결론으로는 이 화면때문에 list index out of range의 error가 나는 것으로 보인다. 따라서 list index out of range의 error가 나면 브라우저를 닫고(driver.quit()) 다시 열어 주소를 치고 검색어를 넣어주고 해당 값을 찾도록 했다. 이렇게 해서 40개 남짓의 키워드들에 대해서는 time.sleep을 전혀 쓰지 않고또 한 번의 실행으로 결과를 얻을 수 있었다.
하지만 이제 그 원인이 네이버의 제한에 의한 것이라는 것을 알았으니, 키워드가 많아지거나 작업의 양이 늘어날 경우 어떤 일이 생길지 알 수가 없었다. 그래서 관련 내용을 좀 찾아보기로 했다.

1: 내 일을 바꾸는 업무 자동화 9.2라이브러리 소개 p.250
2: https://kelvinmwinuka.medium.com/running-selenium-on-macos-using-chromedriver-96ef851282b5, https://kelvinmwinuka.com/running-selenium-on-macos-using-chromedriver/

profile
음...몰라!

0개의 댓글