티스토리 뷰
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
링크
TAG
- F21VDV
- packet sequence number wrong
- F21VDN
- pymysql
- 캐시몽
- OLED64B9BNA
- insert column
- longblob
- 헤이플
- lgtv
- mediumblob
- MariaDB
- LG티비
- libsystemd
- F21VDU
- blob
- OLED65B9GNA
- 최대 크기
- F21VBT
- column 추가
- OLED
- F21VDZ
- OLED65B9
- F21VDT
- 고래문화마을
- 앱테크
- Ubuntu 14.04
- F21VDD
- OLED64B9CNA
- max size
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함