쿠팡 크롤링 안됨 - kupang keulolling andoem

학교 프로젝트에서 쇼핑몰 상품을 크롤링해야할 일이 있어서 BeautifulSoup를 이용하여 쿠팡을 크롤링 해보았다!

아직 크롤링 도구를 정하지 못했다면 python + BeautifulSoup 추천한다!

크롤링 처음해봤는데, 간단하고 좋았다

www.coupang.com/np/categories/465075

크롤링 해볼 쿠팡링크이다, 물티슈 카테고리의 1페이지를 크롤링해보자

(상업적 이용은 문제가 될 수 있습니다!🙅‍♀️)

페이지 분석
쿠팡 크롤링 안됨 - kupang keulolling andoem

먼저 쿠팡페이지 구성을 하나씩 살펴보자

페이지에 접속해서 F12를 눌러서 개발자모드를 켠 뒤

쿠팡 크롤링 안됨 - kupang keulolling andoem

위 아이콘을 눌러주면 페이지를 클릭했을 때 그 부분애 대한 html코드가 보여지고

코드에 마우스를 갖다대면 페이지에서 해당 부분이 표시된다. 매우 편함

쿠팡 크롤링 안됨 - kupang keulolling andoem

먼저, 상품리스트 부분을 추출해볼것이다.

ul태그에 id:productList인 부분이 상품 리스트 이다.

쿠팡 크롤링 안됨 - kupang keulolling andoem

ul태그 아래에 li태그, class : baby-product renew-badge인 것이 상품 하나를 담고 있다

아이템은 여러개이므로, id가 아니라 class로 걸러내어야한다!

이와 같은 방식으로 li안에서 이미지, 링크, 상품이름, 가격을 추출해보자

소스 코드

먼저, 이 웹페이지를 불러와야한다.

다른 파일에서도 사용할 수 있도록 libs에 url에 get요청 보내는 함수를 생성해두었다.

libs/coupang/stringgetter.py

import requests

headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}

def getPageString(url):
    data = requests.get(url, headers = headers)
    print(data.content)
    return data.content

headers는 원래는 필수값이 아니다. 하지만 쿠팡의 경우 headers 없이 크롤링 했을 땐 결과가 하나도 안나온다.

그래서 headers를 위와 같이 설정해주면 된다!

coupang/callUrl.py

from libs.coupang.stringgetter import getPageString

url = "https://www.coupang.com/np/categories/465075"

print(getPageString(url))

위에서 만든 코드를 테스트해보는 코드이다.

getPageString함수를 불러오고

url을 설정하여 호출해주면 된다.

쿠팡 크롤링 안됨 - kupang keulolling andoem
url 결과

이렇게 html이 통째로 불러와진 것을 볼 수 있다.

아주 읽기 힘들다....

이제 여기서 우리가 원하는 것을 추출하면 된다!

원하는 부분의 위치만 잘 찾아내면 아주 간단하다.

coupang/getProducts.py

from libs.coupang.stringgetter import getPageString
from bs4 import BeautifulSoup

def getProducts(string):
    bsObj = BeautifulSoup(string, "html.parser")
    ul = bsObj.find("ul", {"id":"productList"})  #아이템 리스트부분 추출
    lis = ul.findAll("li", {"class":"baby-product renew-badge"}) #각 아이템 추출

    for item in lis:
        #url
        a = item.find("a", {"class": "baby-product-link"})
        url = a.get('href')
        print("url:", url)

        #name
        div_name = item.find("div", {"class":"name"})
        name = div_name.getText()
        print("name:", name)

        #image
        dt_image = item.find("dt", {"class":"image"})
        image = dt_image.find("img").get('src')
        print("image:", image)

        #price
        price = item.find("strong", {"class":"price-value"}).getText()
        print("price:", price)

    print(len(lis))
    return []

url = "https://www.coupang.com/np/categories/465075"

pageString = getPageString(url)
print(getProducts(pageString))
  1. 크롤링할 url을 아까 만든 stringgetter의 함수 getPageString에 넣어서 실행(아래쪽 코드)
  2. 먼저 아이템리스트에 해당하는 ul부분을 추출
  3. 아이템 추출, lis는 배열
  4. lis요소 1개씩 돌아가면서 url, name, image, price를 추출
  5. lis길이를 출력하여 모든 아이템을 불러왔는지 확인
쿠팡 크롤링 안됨 - kupang keulolling andoem
결과화면

모든 값이 들어갔다

혹시 특정 값들이 None이라면 값이 없는것이니 태그와 클래스 이름, 포함관계 등을 다시 확인해보자

주요 코드 정리
from bs4 import BeautifulSoup

bsObj = BeautifulSoup(string, "html.parser") #string 부분은 가져온 html코드

#1개만 있는 경우 find 사용, 앞에 태그, (선택사항)뒤엔 중괄호로 id, class
ul = bsObj.find("ul", {"id":"value"})  
a = bsObj.find("a", {"class": "value"})

#여러개인 경우 findAll 또는 find_all, 배열로 생성됨
lis = ul.findAll("li", {"class":"value"})

#추출한 태그에서 속성 또는 값 가져올 때
href = a.get('href')  #href속성 가져옴
text = a.geText()  #태그 사이 글씨 가져옴 ex) <h2>글씨</h2>

참고)  github.com/Kyeongrok/python_crawler/tree/master/lecture/lecture_gn2/week5