학교 프로젝트에서 쇼핑몰 상품을 크롤링해야할 일이 있어서 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을 설정하여 호출해주면 된다.
이렇게 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))
- 크롤링할 url을 아까 만든 stringgetter의 함수 getPageString에 넣어서 실행(아래쪽 코드)
- 먼저 아이템리스트에 해당하는 ul부분을 추출
- 각 아이템 추출, lis는 배열
- lis요소 1개씩 돌아가면서 url, name, image, price를 추출
- 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연산하기 (0) | 2022.03.04 |
---|---|
[Python] .py 백그라운드 실행 (nohup) (0) | 2021.08.15 |
[AWS][EC2] ssh 접속 시 WARNING: UNPROTECTED PRIVATE KEY FILE! 에러 (0) | 2021.06.02 |
[MacOS] nvm 설치, 환경변수 설정 (zsh) (0) | 2021.05.31 |
[MacOS] Homebrew 설치 후 환경변수 설정 (0) | 2021.05.31 |