RPA/Python

[BeautifulSoup] 웹 스크래핑 (WEB Scraping) 환경 설정 및 기초

꼰대 2021. 5. 12. 17:23

웹 스크래핑을 위해서 아래 패키지 설치

 

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 idxitem 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)

    

반응형