suyeoniii
수바리의 코딩일기
suyeoniii
전체 방문자
오늘
어제
  • 분류 전체보기
    • 🪓 삽질일기
    • 🔙 Backend
      • 🟢 Node.js
      • 🐈‍⬛ NestJS
      • 🌿 Springboot
      • 🗄️ Database
    • 🌸 Frontend
      • 🌐 React.js
      • 💚 Vue.js
      • 🤖 Android
    • 🕹️ 알고리즘
      • 💯 코딩테스트
    • 🔠 프로그래밍 언어
      • 💛 Javascript
      • 💙 Typescript
    • 🚀 배포
    • 🐱 Git
    • etc.
      • 개발환경
      • 오픈 API
      • 개념정리
      • 커뮤니티
    • AI
      • 생성형 AI
    • 회고

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • javascript
  • 알고리즘
  • AWS
  • vue
  • Spring Boot
  • html
  • C++
  • ec2
  • Git
  • springboot
  • nodejs
  • node.js
  • ubuntu
  • MySQL
  • 백준
  • MAC
  • java
  • 회고
  • android
  • node

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
suyeoniii

수바리의 코딩일기

[Python]정말쉬운 크롤링 - 쿠팡 크롤링 하기
etc.

[Python]정말쉬운 크롤링 - 쿠팡 크롤링 하기

2021. 4. 30. 22:06
반응형

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

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

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

 

 

www.coupang.com/np/categories/465075

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

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

 

페이지 분석

 

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

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

 

 

 

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

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

 

 

 

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

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

 

 

 

 

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을 설정하여 호출해주면 된다.

 

 

 

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길이를 출력하여 모든 아이템을 불러왔는지 확인

 

결과화면

 

모든 값이 들어갔다

혹시 특정 값들이 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) <h1>글씨</h1>

 

 

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

반응형
저작자표시 (새창열림)

'etc.' 카테고리의 다른 글

switch문 OR연산하기  (1) 2022.03.04
[Python] .py 백그라운드 실행 (nohup)  (0) 2021.08.15
[AWS][EC2] ssh 접속 시 WARNING: UNPROTECTED PRIVATE KEY FILE! 에러  (1) 2021.06.02
[MacOS] nvm 설치, 환경변수 설정 (zsh)  (0) 2021.05.31
[MacOS] Homebrew 설치 후 환경변수 설정  (2) 2021.05.31
    'etc.' 카테고리의 다른 글
    • [Python] .py 백그라운드 실행 (nohup)
    • [AWS][EC2] ssh 접속 시 WARNING: UNPROTECTED PRIVATE KEY FILE! 에러
    • [MacOS] nvm 설치, 환경변수 설정 (zsh)
    • [MacOS] Homebrew 설치 후 환경변수 설정
    suyeoniii
    suyeoniii
    개발관련 문제 해결, 공부한 내용 등을 업로드합니다.

    티스토리툴바