ㅇ 프로젝트/(Toy)_project

crawling을 통해 그래픽카드의 특가를 노려보자.

BrainKimDu 2022. 9. 29. 22:14

들어가기전 pinkwink 강사님께서 수업자료와 관련되어 실습을 스스로 진행하여 블로그에 기술하는 것에
문제가 없다고 언급해주시어

오늘까지 나만의 프로젝트로 진행을 하고, 주말동안 강의자료의 프로젝트를
나만의 관점으로 재해석하여 등록하도록하겠습니다.

예정대로 이번주 주말에는 커리큘럼을 전반적으로 수정할 계획이며
(월간계획서 보고서 작성)

금요일에는 세계 테러 데이터 분석 내용이 올라갈 예정입니다.
(daily project)


한창 비트코인으로 난리났던 시절
그래픽카드를 구하기가 하늘의 별따기와 같았던 시절이 있었습니다.

그 때마다
비싼 그래픽카드를 그나마 덜 비싸게 팔아주는 한정수령 특가가 나오고 하였는데

제 기억상으로
지름/할인정보 | 퀘이사존 (quasarzone.com)

 

퀘이사존

퀘이사존은 하드웨어, 게임, 취미 활동을 모두 아우르는 종합 커뮤니티를 표방합니다.

quasarzone.com


해당 사이트를 확인하면서 특가를 노렸던 기억이 있습니다.
그래서 특가를 올리는 사람들을 보면서 어떤 비결이 있는걸까 생각을 해보니

특별한 기술이 있는게 아니였습니다. 그냥
남들보다 더 신경을 써서 웹서핑을 하면서 좋은 물건을 찾으면
(내가먼저 결제하고) 커뮤니티 사이트에 공유하는 방식이였습니다.


그래서 이번 시간은 쥐마켓, 옥션, 11번가 등등에서
3070을 구매하는 입장이 되어 크롤링을 진행하고자 합니다.


우선 쥐마켓에서 rtx3070을 검색하니 문제가 생겼습니다.

상상하지도 못한 노트북의 등장...

그래서 조금 거르고 시작합시다.
pc주변기기를 누르고 긁어보도록 하죠

이 상태로 주소를 복사합니다.

그리고 쥬피터 노트북에 작성을 시작합시다.

In[1] : requests, BeautifulSoup는 크롤링에 사용하는 툴입니다. / pandas 데이터 분석에 필요합니다.
In[2] : url에 주소를 저장합니다
In[4] : response 변수에 주소의 Html 정보를 찾아 저장해라 라는 느낌이라 생각하면됩니다.
-> 결국 주요 라이브러리를 삽입하고, 해당사이트의 데이터 정보를 가져와 변수에 저장하였습니다. 결과값이 200으로 나온다면 잘 저장된 것입니다.

크롬은 f12를 누르지만 엣지는 이렇게 개발자모드로 입장합니다.

빨간원부분을 클릭하고 원하는 지점을 찾습니다.

제목을 마우스로 클릭한 상태에서

selector 복사를 하시면됩니다.

GPU3070 =soup.select('#section__inner-content-body-container > div:nth-child(2) > div:nth-child(12) > div.box__item-container > div.box__information > div.box__information-major > div.box__item-title > span > a > span.text__item')
GPU3070

결과값으로 제목 부분이 나오는 것을 볼 수 있습니다.

하지만 한가지 데이터를 긁어오는 것이 아니라
반복문으로 여러 데이터를 긁어야하기 때문에
우리는 특정 키워드를 찾아야합니다.

상품을 보이는 가장 상위클래스가 위의 스크린샷에 나와 있습니다. 이 밑의 div class가 우리가 찾는 내용입니다.

한페이지에 100개 3070 물품 정보가 올라와 있습니다.

이제 원하는 정보를 빼내는 과정을 진행해봅시다.

원하는 정보가 무엇일지
이름, 가격, 배송비
(제조사가 있지만, 대부분 물건 맨앞에 제조사 이름이 들어가기 때문에 따로 뽑지는 아니합니다.)

이 4가지 정보를 추출하도록 합시다.


 

이름을 클릭하니 text__item 이라는 고유 이름이 보입니다. 이를 통해 추출합니다.

정확하게 뽑아내는데, 한가지 문제가 있습니다.
3070ti의 존재를 까먹고 있었습니다.

차라리 3070ti를 찾았다면 편했을텐데..
죄송합니다. 여튼 주어진 시간은 한정적이고 나는 크롤링을 연습하는 상황이니
뭐 어쩌겠습니까 3070과 3070ti 를 둘다 찾는 것으로 합시다.
(주말에 시간이 나면 3070만 분리하는 연습을 해보겠습니다.)


그 다음은 가격을 추출합시다.

box__price-seller 를 통해서 가격을 가져옵니다.



배송비

맨위 아이템은 배송비가 무료이기 때문에 빈칸으로 나온다.


그러면 정보 100개를 뽑아보자.

datas = []

for item in GPU3070:
    datas.append({
        "title": item.select_one(".text__item").text,
        "price": item.select_one(".box__price-seller").text,
        "tag": item.select_one(".list-item__tag").text,
    })

df = pd.DataFrame(datas)
df.head()

이런식으로 결과가 나오게 됩니다.

 

그러면 금액을 전처리하여 숫자로 표시해봅시다.
price 부분 뒤에 이렇게 추가를 해줍시다.
"price": item.select_one(".box__price-seller").text.strip().split(" ")[1],

그러면 보시는 것처럼 변경되는 것을 볼 수 있습니다.
그리고 ,와 원을 지웁시다.
"price": item.select_one(".box__price-seller").text.strip().split(" ")[1].replace(",","").replace("원",""),


그러면 지워졌습니다.

그러면 우리가 저번에 배웠던 방식으로 가격이 저렴한 순으로 정렬을 해봅시다.

단. 파이썬의 sort 함수는 백만을 넘을 경우 정상적으로 작동하지 않습니다.

그렇기 때문에

datas = []

for item in GPU3070:
   datas.append({
       "title": item.select_one(".text__item").text,
       "price": int(item.select_one(".box__price-seller").text.strip().split(" ")[1].replace(",","").replace("원",""))/10,
       "tag": item.select_one(".list-item__tag").text,
   })

df = pd.DataFrame(datas)
df.sort_values(by="price",ascending = True).head(30)


10을 나눠주는 것으로 해결을 하고자 합니다.

가격이 낮은 순으로 출력하는 것을 확인하였습니다.

이것으로 그래픽카드 크롤링 및 정렬을 마칩니다.

자야지,,