안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.
오늘은 예전에 다루었던 글에 달린 댓글에 대한 답변을 위해 간단히 글을 작성해보려 합니다.
저는 아래의 글에서 네이버 뉴스 검색 첫페이지의 기사 10개를 주기적으로 확인하고, 새롭게 추가된 기사만을 텔레그램으로 보내주는 프로젝트를 해보았습니다.
2021.04.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기
해당 프로젝트의 크롤링 방식은 Request와 beautifulsoup을 이용한 정적 크롤링이었죠. 저는 주로 페이지가 변경되는 경우는 selenium 패키지를 이용해서 페이지 번호를 직접 클릭하면서 페이지를 변경했었답니다.
댓글을 달아주신 분께서는 정적 크롤링 방식으로 페이지를 변경하면서 원하는 정보를 얻길 원하셨던 것이죠.
이번 시간에는 네이버 스마트스토어 한 곳의 상품 정보를 여러 페이지 크롤링하고 그 정보들을 엑셀로 저장해보겠습니다.
1. 컨셉
코딩을 들어가기 전에 대략적인 컨셉을 잡아봐야겠죠?
1) 원하는 스마트스토어 페이지의 url을 이용해 html을 받아온다
2) 제품명과 가격정보를 크롤링한다
3) 다음 페이지에서 같은 일을 반복한다
4) 원하는만큼 반복하며, 리스트에 계속 정보를 누적한다
5) 누적된 리스트를 엑셀에 저장한다.
2. 페이지 변경에 따른 url 변경 규칙 파악
이제 컨셉을 잡았으니 코딩에 필요한 재료를 구하러 가보겠습니다.
저는 컴퓨존에서 운영하는 스마트스토어 페이지에서 전체상품 탭을 클릭한 후, 누적판매순으로 출력되는 것을 최신등록순으로 바꾼 후의 페이지를 목표 url로 하였습니다.
여기서 페이지 번호를 1, 2, 3 바꿔가며 클릭하면 아래에 표시한 url에서 page=숫자 부분만 변경되는 것을 확인하실 수 있을거예요. 나중에 코딩에 들어가면 이 부분을 '문자열 포매팅'과 'for 반복문' 개념을 이용해주면 될 것 같네요.
3. 제품명 & 가격정보 html 정보 파악
크롬에서 F12를 눌러서 목표로 하는 제품명과 가격정보의 html 정보, 정확히는 CSS Selector 정보를 파악합니다.
이 부분을 잘 모르시는 분들은 아래의 글을 참고해주세요.
2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리
4. 전체 코드
# step1.라이브러리 불러오기
import requests
from bs4 import BeautifulSoup as bs
import telegram
import time
import pandas as pd
# step2.제품명과 제품가격정보를 담을 빈 리스트 선언
product_name = []
product_price = []
# step3.for문을 이용해서 원하는 페이지에 접근, 정보 추출 후 리스트에 담기
for page_num in range(3):
# range를 이용하면 0부터 인덱스가 시작되므로 page_num에 1을 더해준 url을 이용
url = f'https://smartstore.naver.com/compuzone/category/ALL?st=RECENT&free=false&dt=IMAGE&page={page_num+1}&size=40'
# html 정보 받아와서 파싱
response = requests.get(url)
soup = bs(response.text , 'html.parser')
# css selector로 페이지 내의 원하는 정보 가져오기
html_product = soup.select('strong.QNNliuiAk3')
html_price = soup.select('span.nIAdxeTzhx')
# 텍스트만 추출
for i in html_product:
product_name.append(i.get_text())
for i in html_price:
product_price.append(i.get_text())
# step4.zip 모듈을 이용해서 list를 묶어주기
list_sum = list(zip(product_name, product_price))
# step5.데이터프레임의 첫행에 들어갈 컬럼명
col = ['제품명','가격']
# step6.pandas 데이터 프레임 형태로 가공
df = pd.DataFrame(list_sum, columns=col)
# step7.엑셀에 저장
df.to_excel('컴퓨존 제품 목록.xlsx')
5. 실행 결과
한 페이지에 40개의 품목이 있으니, 정확히 3개의 페이지에서 모든 제품명과 가격 정보를 크롤링해서 엑셀로 저장한 것을 확인할 수 있습니다.
오늘 준비한 내용은 여기까지입니다.
감사합니다.