티스토리 뷰

728x90

 

안녕하세요.

오늘은 python으로 네이버 쇼핑 카테고리 BEST를 크롤링(Crawling)하는 예제로 어떻게 하는지 소개하겠습니다.

참고로 이 글은 2022-03-03 작성되었고 이후 네이버에서 웹 구조를 변경하면 그에 맞게 수정이 필요합니다.

 

아래 페이지를 크롤링할 것입니다.

대표사진 삭제

사진 설명을 입력하세요.

크롤링한 후 결과입니다.

가격은 배송비와 묶음 제품 때문에 조금 이상하지만 저 부분은 예외처리할 수 있으므로 패스...

대표사진 삭제

사진 설명을 입력하세요.

 

코드에 주석으로 설명해두었습니다.

한 줄씨 따라가면 원하는 웹페이지를 크롤링을 할 수 있을 것입니다.

# URL을 요청해서 받아오기 위해서 모듈 import
from urllib.request import urlopen
# HTML을 parsing하기 위해서 모듈 import
# beautifulsoup4 모듈을 설치한 적인 없다면 pip install beautifulsoup4로 설치 필요
from bs4 import BeautifulSoup
# 정규식 일치 연산을 위해서 모듈 import, python 표준 라이브러리이므로 별도 설치 필요 없음.
import re
# 엑셀에 기록하기 위해서 모듈 import
# openpyxl을 설치한 적이 없다면 pip install openpyxl로 설치 필요
from openpyxl import Workbook

# 엑셀 workbook을 하나 생성
write_wb = Workbook()
# workbook에서 현재 활성화되어 있는 sheet를 가져옴
active_ws = write_wb.active
# sheet이름을 변경
active_ws.title = "카테고리BEST"
# sheet 첫 줄 작성
active_ws.append(["Title","Price","Link"])
row = 2

# 크롤링할 주소로 URL open
html = urlopen("https://search.shopping.naver.com/best/category/click?categoryCategoryId=50000008&categoryDemo=M04&categoryRootCategoryId=50000008&period=P1D")
# URL에서 받아온 HTML을 parsing
bsObject = BeautifulSoup(html,"html.parser")

# paring된 결과에서 Tag name이 li이고 class 값으로 imageProduct_item을 가지는 list를 찾음.
# 카테고리BEST 페이지는 제목 목록이 List로 구성되어 있고 해당 class 값으로 시작하여 아래와 같이 찾음.
# class대신 class_를 사용하는 이유는 class가 고유 명칭이라서 BeautifulSoup에서 class_로 지원함.
for li in bsObject.find_all('li', class_=re.compile("imageProduct_item")):
    # 찾은 리스트에서 하위 목록을 돌면서 원하는 값을 찾음.
    for content in li.contents:
        # 가격과 제품명은 div로 두 번 묶여 있어서 2중으로 검색
        if content.name == 'div':
            for sub_content in content:
                if sub_content.name == 'div':
                    class_text = sub_content.get('class')

                    # class값이 없는 아이템도 있으니 예외처리
                    if class_text is not None:
                        # class는 여러 개 존재할 수 있으므로 List로 반환됨. 첫 번째 값을 사용
                        if class_text[0][:18] == 'imageProduct_price':
                            price = sub_content.get_text()
                        elif class_text[0][:18] == 'imageProduct_title':
                            title = sub_content.get_text()
        # link는 바로 있음
        elif content.name == 'a':
            link = content.get('href')

    # 확인용으로 출력
    print("%s,%s,%s\n" % (price,title,link))

    # 엑셀에 기록
    active_ws.cell(row,1,title)
    active_ws.cell(row,2,price)
    active_ws.cell(row,3,link)

    row += 1

# 엑셀을 저정하고 닫음
write_wb.save('카테고리BEST.xlsx')
write_wb.close()
 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함