웹 스크래핑을 위해서 아래 패키지 설치
Termanal> pip install requests
Termanal> pip install beautifulsoup4
Termanal> pip install lxml
beautifulsoup4 document :
https://www.crummy.com/software/BeautifulSoup/bs4/doc.ko/
쇼핑몰에서 노트북으로 검색하여 출력되는 정보 (제품명, 가격, 평점, 리뷰수, 링크) 가져오기
import requests
import re
from bs4 import BeautifulSoup
# user-agent가 headless로 요청되기 때문에 HEADERS의 User-Agent를 변경
# Accept-Language는 구글 같은 다국어 지원 서비스를 위해 한국을 명시
HEADERS = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
'Accept-Language':'ko-KR,ko',
}
# 쇼핑몰에서 노트북으로 검색하는 URL
url = 'https://www.coupang.com/np/search?q=%EB%85%B8%ED%8A%B8%EB%B6%81&channel=user&component=&eventCategory=
SRP&trcid=&traid=&sorter=scoreDesc&minPrice=&maxPrice=&priceRange=&filterType=
&listSize=36&filter=&isPriceRange=false&brand=&offerCondition=&rating=0&page=1&
rocketAll=false&searchIndexingToken=1=4&backgroundColor='
# HEADERS 값 변경해서 요청
res = requests.get(url, headers=HEADERS)
# 응답코드가 200이 아니면 에러 발생 시키고 프로그램 종료
res.raise_for_status()
soup = BeautifulSoup(res.text, 'lxml')
# li태그의 class이름이 search-product로 시작하는 모든 값 가져오기 위해 find_all 사용 (제품 리스트)
# class 이름이 search-product-XXXXX 로 명칭된 것들이 많아 정규식으로 찾는다.
items = soup.find_all('li', attrs={'class':re.compile('^search-product')})
for idx, item in enumerate(items):
# li 태그에 포함된 것들을 찾으므로 find 사용
# 광고 표시된 제품 제외
ad = item.find('span', attrs={'class':'ad-badge-text'})
if ad:
continue
name = item.find('div', attrs={'class':'name'}).get_text()
price = item.find('strong', attrs={'class':'price-value'}).get_text()
rate = item.find('em', attrs={'class':'rating'})
# 평점 없는 제품 제외
if rate:
rate = rate.get_text()
rate_cnt = item.find('span', attrs={'class':'rating-total-count'})
# 리뷰 없는 제품 제외
if rate_cnt:
rate_cnt = rate_cnt.get_text()
# (12), (256) 다음과 같은 포멧을 () 빼고 12, 256으로 변환
rate_cnt = rate_cnt[1:-1]
# 링크 정보
link = item.find('a', attrs={'class':'search-product-link'})['href']
link = 'https://www.coupang.com'+link
# 이미지 다운로드
image = item.find('img', attrs={'class':'search-product-wrap-img'})
image_url = image['src']
# '//'로 시작한다면..
if image_url.startswith('//'):
image_url = 'https:'+image_url
image_res = requests.get(image_url)
image_res.raise_for_status()
# 파일 저장
with open('com_{0}.jpg'.format(idx+1), 'wb') as f:
f.write(image_res.content)
'RPA > Python' 카테고리의 다른 글
[BeautifulSoup, selenium] 동적 스크롤 페이지 스크래핑 (0) | 2021.05.14 |
---|---|
[BeautifulSoup] 기업 시가총액 순위, 엑셀/CSV로 저장 (0) | 2021.05.13 |
[openpyxl, python-pptx] 엑셀 주소록 읽어 파워포인트로 명찰 만들기 (0) | 2021.05.09 |
[python-pptx] 특정 슬라이드를 하나의 파일로 만들기 (0) | 2021.05.09 |
[python-pptx] 슬라이드 삭제 (0) | 2021.05.09 |