파이썬 비동적 사이트 크롤링 BeautifulSoup - G마켓 상품정보 크롤링하기
임포트
import pandas as pd
import requests
from bs4 import BeautifulSoup
를 미리 임포트 해주자
Url 찾기
이번 게시글에서는 g마켓의 게임 카테고리 best100 제품을 크롤링 해볼 것이다
데이터 크롤링을 위해서는 우선 해당 페이지의 html 파일을 불러올 url이 필요하다
gmarket.co.kr/n/best?jaehuid=200011415&viewType=C&largeCategoryCode=100000111
G마켓 게임 베스트 100 사이트에 들어가 개발자 도구에 들어간다
이후 network에 들어가 all을 눌러준 다음 F5를 눌러 사이트를 재접속하자
그러면 이렇게 네임창 맨 위에 링크가 하나 뜨는데 이게 바로 해당 사이트의 HTML을 불러오는 url이다
모든 사이트는 처음 시작될때 html 부터 불러오기 때문에 이름에 상관없이 그냥 맨 위의 것을 눌러주면 된다
옆의 Request URL에서 url을 얻어주자
url의 html데이터를 BeautifulSoup 객채로 변환하기
url = 'https://www.gmarket.co.kr/n/best?jaehuid=200011415&viewType=C&largeCategoryCode=100000111'
best = BeautifulSoup(requests.get(url).text, 'html.parser')
해당 코드를 사용해 best 변수에 requests로 요청한 html 파일을 BeautifulSoup 객채로 변환 할 수 있다
css 셀렉터 찾기
비동적 사이트는 앞의 동적 사이트와 다르게 정보를 json으로 뿌려주지 않기에
직접 html에서 원하는 데이터를 골라야한다
이 때 필요한게 css셀렉터다
직접 적을 수 있다면 적어도 좋겠지만 그건 너무 번거롭기 때문에
크롬 개발자도구의 힘을 빌려보도록 하겠다
개발자 도구에 들어가 Elements를 선택하고 저기 표시된 버튼을 누르면
마우스가 가리키는 위치의 코드를 알려준다
이후 코드에서 우클릭을 하고 copy- copy selector을 눌러주면 셀렉터를 복사할 수 있다
복사한 셀렉터는
#gBestWrap > div.best-list > ul > li:nth-child(1) 이렇게 생겼는데 해당 셀렉터는
상품 페이지의 1번 칸을 고르는 셀렉터다
우리가 원하는건 1번만 크롤링 하는 것이 아닌 100개를 모두 크롤링 하는 것이기 때문에
nth-child를 지워서
#gBestWrap > div.best-list > ul > li 로 만들어주자
select() 이용하기
select는 BeautifulSoup에서 selector을 이용해 여러 객체를 가져올 때 사용한다
방금 전 얻어낸 셀렉터를 여기 넣어주면
selector = '#gBestWrap > div.best-list > ul > li'
bests = best.select(selector)
이런 식으로 상품 정보쪽의 html 코드만 골라 올 수 있다
이 데이터 안에는 상품 100가지의 모든 정보가 담겨있지만
이 자체로 크롤링을 했다고 할 수는 없다
이후 데이터를 하나씩 선택해 분류하는 작업이 필요하다
select_one
우선 상품명만 긁어와보자
저기 html코드를 자세히 보면
상품명이 itemname이라는 이름을 가진 클래스 내에 들어가 있는 것이 보인다
이를 이용해 2번 상품의 상품 이름을 가져와보자
bests[1].select_one('.itemname').text
2번 상품에서 itemname이라는 클래스에서 text만 추출한다는 코드다
깔끔하게 상품 이름만 가져 올 수 있었다
이번에는 이미지를 가져와보자
다시 앞의 코드를 잘 확인해보면
여기 img클래스와 src부분에 이미지 링크가 보인다
bests[1].select_one('img').get('src')
위 코드로 손쉽게 이미지 url을 얻어낼 수 있다
반복문으로 데이터 긁어오기
위에서는 2번째 상품의 데이터만 긁어왔지만 반복문을 이용하면 100가지 상품 모두의 데이터를 긁어 올 수 있다
데이터 프레임으로 변환하기 좋게 딕셔너리 형태로 데이터를 긁어와보자
items = []
for item in bests:
items.append({
'title' : item.select_one('.itemname').text,
'img' : 'http:' + item.select_one('img').get('src'),
})
해당 코드를 사용하면
bests에 저장된 모든 상품에서 이름과 이미지 url을 item리스트 안에 각각의 딕셔너리로 저장한다
pd.DataFrame(items)
코드로 손쉽게 데이터 프레임으로 변경 할 수 있다