ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Selenium과 BeautifulSoup4를 사용해 네이버 카페 검색 결과 크롤링하기
    언어/파이썬 & 장고 2020. 5. 26. 21:03

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

    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()


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

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

    댓글