네이버 카페에 원하는 키워드를 입력해 검색하고, 해당 검색 결과 리스트를 크롤링하는 방식을 설명합니다. 크롤링 사이트는 네이버 카페 중고나라를 타겟으로 합니다.

selenium과 beautifulsoup 모듈을 사용하고 웹드라이버는 Phantom JS가 아닌 chromedriver의 headless 모드를 사용하여 로 진행합니다. chromedriver를 받으실 때, chrome://settings/help 에서 현재 설치된 크롬의 버전과 동일한 드라이버를 다운 받으셔야 시작부터 막히지 않습니다.

selenium과 beautifulsoup 사용법은 아래 정리된 게시물을 확인하시면 도움이 됩니다.

[Python] Selenium 사용하기 (+PhantomJS)

[Python] BeautifulSoup 사용하기

버전

파이썬 3.7

requests 2.23

selenium 3.141

lxml 4.5.1

beautifulsoup 4.9.1

chromedriver 83

로그인 없이 중고나라 크롤링 하기

확인해본 결과, 굳이 로그인을 진행하지 않아도 중고나라에서 검색을 하고 결과를 받아올 수 있었습니다.

from bs4 import BeautifulSoup
from selenium import webdriver
from urllib import parse


options = webdriver.ChromeOptions()
# options.add_argument('headless')


chrome_driver = webdriver.Chrome('chrome/chromedriver', options=options)

chrome_driver.implicitly_wait(3)
# 중고나라 URL
url = 'https://cafe.naver.com/joonggonara'
# 중고나라 네이버 카페 아이디
joonggonara_id = 10050146
# 검색어
search_keyword = '로말레오'.encode('cp949')
# url 인코딩 진행
encode_search_keyword = parse.quote(search_keyword)

full_url = f'{url}?iframe_url=/ArticleSearchList.nhn?search.clubid={10050146}%26search.searchBy=0%26search.query={encode_search_keyword}'

chrome_driver.get(full_url)
# iframe으로 변경
chrome_driver.switch_to.frame("cafe_main")

html = chrome_driver.page_source
bs = BeautifulSoup(html, 'lxml')

# 검색 결과 리스트에 해당되는 태그들만 추출
td_results = bs.find_all('td', class_='td_article')

print(td_results)



# 호출된 페이지 URL: https://cafe.naver.com/joonggonara?iframe_url=/ArticleSearchList.nhn?search.clubid=10050146%26search.searchBy=0%26search.query=%B7%CE%B8%BB%B7%B9%BF%C0


위 코드는 로말레오라는 제품 명을 중고나라에 검색하고 결과 리스트의 태그들만 가져오는 코드입니다. 아래에서는 코드의 순서대로 중요한 부분에 대해서 설명을 합니다.


1. 테스트를 위해 headless 모드를 제거합니다. 또한 webdriver.Chrome()의 첫 번째 파라미터는 위에서 받은 chromedriver의 경로 + 파일명을 입력해 줍니다.

2. 검색을 위해 중고나라 카페의 고유 ID를 저장합니다. 중고나라 포함한 다른 네이버 카페의 ID는 해당 카페의 HTML 소스에서 clubid 로 검색하시면 찾을 수 있습니다.

3. 여기서 검색어는 UTF-8이 아닌 CP949(네이버 HTML 코드를 보면 MS949라고 나와 있지만 CP949와 동일)로 인코딩을 진행한 다음, 다시 URL 인코딩을 거친 형태를 만들어야 원하고자 하는 검색어가 완성됩니다.

4. 네이버 카페의 경우, 검색을 진행하면 iframe으로 창이 열리기 때문에, 기존의 크롤링 방식대로 사이트의 HTML을 분석해서 특정 태그에 검색어를 입력하는 방식으로는 진행이 불가능했습니다. 따라서 호출하는 페이지 iframe URL부분에  중고나라 카페 ID, 검색 정렬 방식, 검색어를 입력하도록 진행했습니다.

  • URL에서 중요한 부분은 URL 인코딩 문자인 %26을 &로 변환해서 호출하면 결과가 제대로 호출되지 않습니다.

5. 완성된 URL로 페이지를 호출합니다. 이후 검색 결과가 보여지는 iframe인 cafe_main으로 페이지를 변환합니다. 만약 변환을 하지 않으면 검색한 결과에 대한 소스를 가져올 수 없습니다.

6. 다음 td_article 태그에 존재하는 상품번호, 상품명, 상품상세페이지URL 태그 정보들을 리스트 형태로 저장합니다. td_article 태그 아래에는 판매 여부, 신규 등록 여부 등이 있습니다. 



여기서는 로그인을 하지 않고 네이버 카페에서 검색어를 지정해 결과를 가져오는 예시를 설명 드렸습니다.


만약 로그인이 필요하다면

chrome_driver.get('https://nid.naver.com/nidlogin.login') # 아이디 비밀번호 입력 페이지
chrome_driver.find_element_by_id('id').send_keys('본인아이디')
chrome_driver.find_element_by_id('pw').send_keys('본인비밀번호')
# 양식 제출
chrome_driver.find_element_by_xpath('//*[@id="frmNIDLogin"]/fieldset/input').click()


위의 코드를 네이버 카페 페이지 호출 전에 실행하면 됩니다.

(자동입력방지문자가 나오는 경우가 있는데 아직 이 부분은 해결하지 못했습니다..)

  1. 허윤도 2020.07.26 05:20

    이거 지금은 또 네이버가 바껴서 실행안되는거 맞죠?ㅠ

    • 불곰1 2020.07.26 17:06 신고

      네이버에서 내부 구조를 변경했으면 실행이 안됩니다ㅠㅠ 다시 HTML 코드를 분석해서 수정해줘야 합니다ㅠㅠㅠ