-
[Python] Selenium과 BeautifulSoup4를 사용해 네이버 검색 결과 크롤링하기언어/파이썬 & 장고 2020. 5. 27. 20:40
[Python] Selenium과 BeautifulSoup4를 사용해 네이버 카페 검색 결과 크롤링하기 에서는 네이버 카페를 타게팅하여 크롤링 하는 방법을 소개했다면 여기서는 네이버 검색 결과를 크롤링 하는 방법을 소개합니다.
코드 실행 환경이나 사전 설치의 설명은 위 게시글 첫 문단에서 확인할 수 있습니다.
네이버 검색 결과 크롤링하기
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 = 'https://search.naver.com/search.naver' search_keyword = '로말레오' full_url = f'{url}?where=articlec&ie=utf8&query={search_keyword}&prdtype=4&t=0&st=date&date_option=0&date_from=&date_to=&srchby=title&dup_remove=1&cafe_url=&without_cafe_url=&board=&sm=tab_btn&start=1' chrome_driver.get(full_url) html = chrome_driver.page_source bs = BeautifulSoup(html, 'lxml') tag_results = bs.find_all('li', class_='sh_cafe_top') for tag_result in tag_results: a_tag = tag_result.find('a', class_='sp_thmb') img_tag = a_tag.find('img', class_='sh_cafe_thumbnail') dl_tag = tag_result.find('dl') title_a_tag = dl_tag.find('a', class_='sh_cafe_title') href = a_tag.get('href') title = title_a_tag.text img_alt = img_tag.get('alt') print(img_tag.get('src')) img_src = 'http' + parse.unquote(img_tag.get('src').split('http')[2]) content = dl_tag.find('dd', class_='sh_cafe_passage').text price = dl_tag.find('span', class_='num').text cafe_name = dl_tag.find('a', class_='txt84').text date = dl_tag.find('dd', class_='txt_inline').text
위 코드는 네이버 검색을 카페탭만 설정하여 결과를 크롤링 하는 예시입니다. 아래에서는 코드의 순서대로 중요한 부분에 대해서 설명을 합니다.
1. 테스트를 위해 headless 모드를 제거합니다. 또한 webdriver.Chrome()의 첫 번째 파라미터는 위에서 받은 chromedriver의 경로 + 파일명을 입력해 줍니다.
2. 호출할 페이지의 URL과 검색어, 쿼리 스트링을 저장합니다. 쿼리 스트링 중, 인코딩을 utf8로 설정해서 별다른 인코딩이 필요하지 않습니다.
쿼리 파라미터들은 아래와 같습니다. 이외의 쿼리 파라미터는 의미를 찾지 못했습니다.
where: 검색 탭 설정
- nexearch: 통합검색
- image: 이미지
- article: 카페-전체글
- articlec: 카페-카페글
- articleg: 카페-일반글
- cafe: 카페-카페명
- post: 블로그
카페 상단 탭일 경우, 하단에 부가 탭이 존재
ie: 인코딩
- utf8, cp949 등등
query: 검색어
prdtype: 거래방법 - 거래상태 (안전거래, 직접거래) - (판매중, 판매완료)
- 0: 전체-전체
- 1: 안전거래-전체
- 2: 직접거래-전체
- 3: 전체-전체
- 4: 전체-판매중
- 5: 안전거래-판매중
- 6: 직접거래-판매중
- 7: 전체-판매중
- 8: 전체-판매완료
- 9: 안전거래-판매완료
- 10: 직접거래-판매완료
- 11: 전체-판매완료
- 12: 전체-전체
st: 검색 정렬
- st: 최신순
- re: 관련도순
date_option: 기간 옵션
- 0: 전체
- 1: 1일
- 2: 1주
- 3: 1개월
- 4: 6개월
- 5: 1년
- 6: 직접선택
date_from, date_to: 기간 옵션이 직접 선택일 때 설정 기간 (yyyymmddhhmmss)
- yyyymmdd 나 yyyy.mm.dd 가능
srchby: 검색 영역
- text: 전체
- title: 제목만
dup_remove: 유사 문서
- 0: 포함
- 1: 제외
- cafe.naver.com/카페명
without_cafe_url: 해당 카페를 제외하고 검색
- cafe.naver.com/카페명
start: 페이지
- 1일 경우 1페이지, 2일 경우, 2페이지
3. 네이버 검색의 경우엔 iframe이 아니므로 검색 결과에 해당하는 <li> 태그의 클래스 sh_cafe_top를 가져옵니다.
4. 다음, 추출하고자 하는 데이터에 해당되는 태그들을 분리하여 저장합니다.
5. 이미지 URL의 경우, 그대로 사용하면 검색 결과에서 보여지는 사이즈로 고정이 됩니다. 예제의 경우에는 리사이징이 되기 이전의 이미지를 원하기 때문에 별도의 분리 작업을 통해 이미지 URL을 추출합니다.
- http 문자열로 split을 진행합니다.
- ['', 's://search.pstatic.net/common/?src=', '%3A%2F%2Fcafefiles.naver.net%2FMjAyMDA1MjdfMjA1%2FMDAxNTkwNTY0NzYzMDI0.3h1m-4OyKf2JKQq3c5fgLgqYxuV9aZ_NMJJRpviBh-8g.OvWxrWKxLQV3RZPH4_NtjeiJnz9OGmMbcdzNHeExSK4g.JPEG%2F978DF130-F805-4FED-941C-4CDD3A4A41AC.jpeg&type=m80_80#2771x2433']
- 다음, 리스트의 3번째에 있는 데이터를 추출합니다.
- %3A%2F%2Fcafefiles.naver.net%2FMjAyMDA1MjdfMjA1%2FMDAxNTkwNTY0NzYzMDI0.3h1m-4OyKf2JKQq3c5fgLgqYxuV9aZ_NMJJRpviBh-8g.OvWxrWKxLQV3RZPH4_NtjeiJnz9OGmMbcdzNHeExSK4g.JPEG%2F978DF130-F805-4FED-941C-4CDD3A4A41AC.jpeg&type=m80_80#2771x2433
- 해당 데이터는 url 인코딩이 되어 있는 상태이므로 utf8로 디코딩 작업을 진행합니다.
- ://cafefiles.naver.net/MjAyMDA1MjdfMjA1/MDAxNTkwNTY0NzYzMDI0.3h1m-4OyKf2JKQq3c5fgLgqYxuV9aZ_NMJJRpviBh-8g.OvWxrWKxLQV3RZPH4_NtjeiJnz9OGmMbcdzNHeExSK4g.JPEG/978DF130-F805-4FED-941C-4CDD3A4A41AC.jpeg&type=m80_80#2771x2433
- http 스키마가 없으므로 앞에 http를 붙여 완벽한 url을 만듭니다.
- http://cafefiles.naver.net/MjAyMDA1MjdfMjA1/MDAxNTkwNTY0NzYzMDI0.3h1m-4OyKf2JKQq3c5fgLgqYxuV9aZ_NMJJRpviBh-8g.OvWxrWKxLQV3RZPH4_NtjeiJnz9OGmMbcdzNHeExSK4g.JPEG/978DF130-F805-4FED-941C-4CDD3A4A41AC.jpeg&type=m80_80#2771x2433
네이버 검색 결과 크롤링의 경우에는 네이버 카페와는 다르게 iframe이 존재하지 않아서 네이버 HTML소스와 쿼리 스트링을 잘 분석하면 됩니다. 위의 예제를 응용하면 이미지나 블로그, 지식인과 같은 데이터도 크롤링할 수 있습니다.