Web 크롤링/Python Crawling

[크롤링기초] 네이버 쇼핑 정보 가져오기

Link2Me 2021. 6. 25. 15:34
728x90

네이버 쇼핑 사이트 정보를 스크래핑하는 방법에 대한 예제이다.

먼저 스크래핑할 URL 정보를 입력한 후 크롬 브라우저에서 F12키를 눌러서 html 소스보기를 해서 분석할 대상을 찾는다.

1번을 누르고 마우스로 대상을 찾아 원하는 구조를 파악한다.

 

 

마우스 우클릭으로 Copy Selector를 하면....

#productListArea > ul > li:nth-child(1) > div.price > strong > span.num 를 반환해 준다.

여기서 우리는 #productListArea > ul > li > div.info > span > a.txt 가 필요한 것이라는 알아낼 수 있다.

 

 

이와 같은 방법으로 도출할 항목을 찾아낸다.

 

 

파이썬 코드

# BeautifulSoup은 HTML 과 XML 파일로부터 데이터를 수집하는 라이브러리
# pip install bs4
# pip install requests
# pip install fake-useragent
 
import requests
import re
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import csv
 
# 파싱할 대상 Web URL
url = "https://search.shopping.naver.com/best100v2/detail.nhn?catId=50004603"
# 크롬브라우저가 실행하는 것처럼 속이기
headers = { 'User-Agent': UserAgent().chrome }
res = requests.get(url, headers=headers)
res.raise_for_status()
soup = BeautifulSoup(res.content,'html.parser')
# print(soup)
 
# 스크래핑하고자 하는 전체 데이터를 선택
# items = soup.find_all("li", attrs={"class":re.compile("^^_itemSection")})
items = soup.select('#productListArea > ul > li')
# print(items)
 
shopItemList = [] # 리스트 생성
for item in items:
    temp = []
    # name = item.find('a')['title']#제품명
    name = item.select_one('#productListArea > ul > li > div.thumb_area > a')['title']
    # price = item.find('span', attrs = {'class':'num'}).get_text() + '원' #가격 
    price = item.select_one('#productListArea > ul > li > div.price > strong > span.num').text + '원'
    # link = item.find('div', attrs={'class':'thumb_area'}).find('a')['href'] #링크 
    link = item.select_one('#productListArea > ul > li > div.thumb_area > a')['href']
    # review_count = item.find('span',attrs = {'class':'mall'}).find('em').text #리뷰수
    review_count = item.select_one('#productListArea > ul > li > div.info > span > a.txt > em').text
    # print(review_count)
    review_count = review_count[1:-1]
    temp.append(name)
    temp.append(price)
    temp.append(review_count)
    temp.append(link)
    shopItemList.append(temp)
# print(shopItemList)
 
with open('shopItemList.csv',"w", encoding="utf-8", newline=""as f:
    writer = csv.writer(f)
    writer.writerow(['품명','가격','리뷰수','링크'])
    writer.writerows(shopItemList)
    print('CSV File created!')
f.close
 

crawling_12.py
0.00MB

자료출처 : https://smorning.tistory.com/331 에 나온 코드를 가지고 실제 동작 여부를 확인해보면서 제대로 동작됨을 확인했다.

동영상 강좌를 들어가면서 실습해보는데 동영상 강좌에 나온 사이트 태그 구조 등을 변경해서 동작이 안되기도 해서 제대로 동작되는 코드를 찾아서 테스트 하면서 기능을 익히는 중이다.

 

엑셀로 저장하는 코드

# BeautifulSoup은 HTML 과 XML 파일로부터 데이터를 수집하는 라이브러리
# pip install bs4
# pip install requests
# pip install fake-useragent
# pip install xlsxwriter 
 
import requests
import re
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
# 엑셀 처리 임포트
import xlsxwriter
 
# Excel 처리 선언
savePath = "c:/Users/zx/Documents/Python/"
# workbook = xlsxwriter.Workbook(savePath + 'shopItemList.xlsx')
workbook = xlsxwriter.Workbook('shopItemList.xlsx')
 
# 워크 시트
worksheet = workbook.add_worksheet()
 
# 파싱할 대상 Web URL
url = "https://search.shopping.naver.com/best100v2/detail.nhn?catId=50004603"
# 크롬브라우저가 실행하는 것처럼 속이기
headers = { 'User-Agent': UserAgent().chrome }
res = requests.get(url, headers=headers)
res.raise_for_status()
soup = BeautifulSoup(res.content,'html.parser')
# print(soup)
 
# 엑셀 행 수
excel_row = 1
 
worksheet.set_column('A:A'40# A 열의 너비를 40으로 설정
worksheet.set_row(0,18# A열의 높이를 18로 설정
worksheet.set_column('B:B'12# B 열의 너비를 12로 설정
worksheet.set_column('C:C'12# C 열의 너비를 12로 설정
worksheet.set_column('D:D'60# D 열의 너비를 60으로 설정
 
worksheet.write(00'제품명')
worksheet.write(01'가격')
worksheet.write(02'리뷰수')
worksheet.write(03'링크')
 
# 스크래핑하고자 하는 전체 데이터를 선택
# items = soup.find_all("li", attrs={"class":re.compile("^^_itemSection")})
items = soup.select('#productListArea > ul > li')
# print(items)
 
shopItemList = [] # 리스트 생성
for item in items:
    # name = item.find('a')['title']#제품명
    name = item.select_one('#productListArea > ul > li > div.thumb_area > a').get('title')
    # price = item.find('span', attrs = {'class':'num'}).get_text() + '원' #가격 
    price = item.select_one('#productListArea > ul > li > div.price > strong > span.num').text + '원'
    # link = item.find('div', attrs={'class':'thumb_area'}).find('a')['href'] #링크 
    link = item.select_one('#productListArea > ul > li > div.thumb_area > a').get('href')
    # review_count = item.find('span',attrs = {'class':'mall'}).find('em').text #리뷰수
    review_count = item.select_one('#productListArea > ul > li > div.info > span > a.txt > em').text
    # print(review_count)
    review_count = review_count[1:-1]
    
    # 엑셀 저장(텍스트)
    worksheet.write(excel_row, 0, name)
    worksheet.write(excel_row, 1, price)
    worksheet.write(excel_row, 2, review_count)
    worksheet.write(excel_row, 3, link)
 
    # 엑셀 행 증가
    excel_row += 1
 
# 엑셀 파일 닫기
workbook.close() # 저장
 

 

테스트 샘플 코드

crawling_13.py
0.00MB

728x90