데이터/크롤링

[Python] 네이버 스토어 찜 크롤링 with requests _1탄

Jerry_K 2023. 12. 5. 16:52

전편에 네이버 스토어 정보들을

크롤링하는 법에 대해 포스터를 썼다.

(아직 selenium으로 크롤링하는 분 없길...)

 

selenium은 동적으로 해서 뭐든 크롤링하지만, 

해당 창에 들어가고 웹 로딩도 기다리고....

 

이렇게 하면 시간이 저어엉 마아알   많이 든다.

 

나는 네이버 데이터들을 모으고 있는데 

키워드만 약 5천 개다....

그러면 5천 개의 웹페이지를 로딩해야 하는데

이건 진짜 아니다 ㅠㅠ ( 그래도 손으로 하는 것보단 나음)

 

암튼 말이 좀 길어졌는데 

웬만한 스토어의 정보는  전에 포스트 방식으로 

다 가져올 수 있는데

"찜"  이 자슥만 좀 귀찮게 되어있다.

 

그래서 오늘은 "찜" 개수를 어떻게 가져오는지 

포스팅을 할 예정이다.

 

전에 했던 기본 베이스들이 필요하기 때문에 모르는 분들은 아래 포스트 먼저!

https://fishking.tistory.com/entry/Python-requests%EB%A1%9C-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%9E%A9-%ED%81%AC%EB%A1%A4%EB%A7%81

 

[Python] requests로 네이버 데이터랩 크롤링

학교에서 하는 프로젝트가 서서히 끝나가서, 이제 조금식 여유가 생기고 있다. 이제 다시 내 프로젝트에 집중을 하자 !! ( 문제는 했던 것들이 기억 안남...) 내 개인 프로젝트는 네이버 데이터들

fishking.tistory.com


본격적으로 크롤링 레츠기릿

 

먼저 크롤링을 잘하고 싶다?! 

-> 개발자 도구의 network를 잘 보자

 

우선 아무 키워드나 검색해 본다.

 

 

 

개발자 도구로 network를 봐보자.

 

좌측 상단 빨간 버튼은 recode 버튼으로 

저게 빨간불이 들어와야 기록이 된다.

 

 

 

아마 아무것도 모르는 상태로 network를 보면 

하나같이 다 외계어로 느껴진다.

(기본 컴퓨터 지식이 있으면 훨씬 이해하기 좋다)

 

간단하게 말해 network는

내가 서버에 요청을 하여 필요 정보들을 제공받는데

그 과정들을 기록한 것이라 보면 된다.

 

우리가 필요한 거는 css적인 요소가 아니니까 

이것만 필터링해도 훨씬 보기 편해진다.

 

 

다시 본론으로 돌아와 network의 변화를 유심히 살펴보자.

 

네이버 쇼핑은  비동기화 방식이어서 

한 번에 모든 정보가 업로드되지 않는다.

 

 

 

스크롤을 계속 내리면 필요한 정보들을 서버에 요청을 해서 가져온다.

그 정보들은 network창에  새로 생기니  잘 살펴봐보자.

 

가장 눈에 띄는 products가 보인다. (이미지들은 볼 필요 없음)

 

 

 

products를 자세히 살펴보고 싶어서 products의 preview를 봤다.

 

preview에 보니 딕셔너리 형태로 key형식의 zzim이 있다 ㅋㅋㅋㅋ(단어 선택이 너무 직관적인 거 아니냐구)

 

 

사실누가 봐도 찜이지만.... 

혹시 모르니 1820을 찾아보니 역시나 찜이 맞다.

 

 

 

전에랑 똑같이 curl (bash)로 복사를 한 다음 

아래 url에 들어가 붙여 넣으면 된다.

 

https://curlconverter.com/

 

Convert curl commands to code

GitHub is matching all contributions to this project on GitHub Sponsors. Contribute Now

curlconverter.com

 

그러면 위의 사진처럼 파이썬 언어로 잘 변환해 주는데 그냥 이걸 그대로 복붙 해서 실행하면 된다.

 

 

 

import requests

cookies = {
    'NNB': 'BZQEKFFD3ZGWG',
    'ASID': '75100b1e000001840cfb852400000053',
    'NV_WETR_LOCATION_RGN_M': '"MDUxMTAxMTg="',
    'NaverSuggestUse': 'unuse%26use',
    'autocomplete': 'use',
    'NV_WETR_LAST_ACCESS_RGN_M': '"MDUxMTAxMTg="',
    '_ga': 'GA1.1.687219659.1669681140',
    '_ga_K2ECMCJBFQ': 'GS1.1.1686294140.1.0.1686294145.0.0.0',
    '_ga_SQ24F7Q7YW': 'GS1.1.1686294140.1.0.1686294145.0.0.0',
    'SHP_BUCKET_ID': '9',
    'nx_ssl': '2',
    'nid_inf': '810134771',
    'NID_AUT': 'KzF8qxwc7Q16FWF2l9SHa44CCrK+w0d/hqsKCa7pUemktjJiOa1Y0wOJwiku023b',
    'NID_JKL': '2pCzNeGM0eRah+mdM4vS+Cgv12cmoVRaOHttCDzBnHY=',
    'ncpa': '95694|lprzjkoo|079082572a94ce3307d7ce5cfa1f98813527a107|95694|db6a4b03a9b918f109a3c9db4ab41365ce293096',
    'NID_SES': 'AAABfe+XwW4D1fcFvn9gTr9N4pEznpOL0OCRC6lsKknAC2fgdoyQ2D77YLHd8+A4fm9GgTKU1/tX9a5nyAhVtZszZHuf9RH2+y+RC6js8SHXrpdQ7+me0X/WFtOSQVw6bthv2mN+6Z3eDiiFueaifA538WRRN3yY7eeD8VR6+BfDfxN8UG+Ubu62gkahIaXH6NrYwiNNH9Fdq/fIiQ9jyx7XRh1SVWX5IhvioN8kROpWxKs46wMZwQWLbK9gxyrssjddKWbiI3A6M9ylMzmTFyeuNkZI5xN/RgZNeOwfSfu7q2K/T4AEaa0Kt/giJQ1kgeRyO5CRBXV07cUP5Nng6LYMkxbpxPGrmRmPFI2zSpt21B7RUk6d4dLEmJ0hBKdzn780Lr24rwzJgTs5F39oS5KibAnirlQr2mzi4ZdkKAC/rKY0nA5KIUADO7sWO3aHz7ZMkWQgc5UskJumYa5yshmnVH5xZLieEF8oMQ6fImX6EzfJsoHVzo7ffxK/b4cosQ3+pg==',
    'page_uid': 'iTJ6Bwqo15wssvxstkGssssssxl-399936',
    'spage_uid': 'iTJ6Bwqo15wssvxstkGssssssxl-399936',
}

headers = {
    'authority': 'search.shopping.naver.com',
    'accept': 'application/json, text/plain, */*',
    'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
    'content-type': 'application/json',
    # 'cookie': 'NNB=BZQEKFFD3ZGWG; ASID=75100b1e000001840cfb852400000053; NV_WETR_LOCATION_RGN_M="MDUxMTAxMTg="; NaverSuggestUse=unuse%26use; autocomplete=use; NV_WETR_LAST_ACCESS_RGN_M="MDUxMTAxMTg="; _ga=GA1.1.687219659.1669681140; _ga_K2ECMCJBFQ=GS1.1.1686294140.1.0.1686294145.0.0.0; _ga_SQ24F7Q7YW=GS1.1.1686294140.1.0.1686294145.0.0.0; SHP_BUCKET_ID=9; nx_ssl=2; nid_inf=810134771; NID_AUT=KzF8qxwc7Q16FWF2l9SHa44CCrK+w0d/hqsKCa7pUemktjJiOa1Y0wOJwiku023b; NID_JKL=2pCzNeGM0eRah+mdM4vS+Cgv12cmoVRaOHttCDzBnHY=; ncpa=95694|lprzjkoo|079082572a94ce3307d7ce5cfa1f98813527a107|95694|db6a4b03a9b918f109a3c9db4ab41365ce293096; NID_SES=AAABfe+XwW4D1fcFvn9gTr9N4pEznpOL0OCRC6lsKknAC2fgdoyQ2D77YLHd8+A4fm9GgTKU1/tX9a5nyAhVtZszZHuf9RH2+y+RC6js8SHXrpdQ7+me0X/WFtOSQVw6bthv2mN+6Z3eDiiFueaifA538WRRN3yY7eeD8VR6+BfDfxN8UG+Ubu62gkahIaXH6NrYwiNNH9Fdq/fIiQ9jyx7XRh1SVWX5IhvioN8kROpWxKs46wMZwQWLbK9gxyrssjddKWbiI3A6M9ylMzmTFyeuNkZI5xN/RgZNeOwfSfu7q2K/T4AEaa0Kt/giJQ1kgeRyO5CRBXV07cUP5Nng6LYMkxbpxPGrmRmPFI2zSpt21B7RUk6d4dLEmJ0hBKdzn780Lr24rwzJgTs5F39oS5KibAnirlQr2mzi4ZdkKAC/rKY0nA5KIUADO7sWO3aHz7ZMkWQgc5UskJumYa5yshmnVH5xZLieEF8oMQ6fImX6EzfJsoHVzo7ffxK/b4cosQ3+pg==; page_uid=iTJ6Bwqo15wssvxstkGssssssxl-399936; spage_uid=iTJ6Bwqo15wssvxstkGssssssxl-399936',
    'origin': 'https://search.shopping.naver.com',
    'referer': 'https://search.shopping.naver.com/search/all?adQuery=%ED%95%B8%EB%93%9C%ED%8F%B0%EC%BC%80%EC%9D%B4%EC%8A%A4&frm=NVSCPRO&origQuery=%ED%95%B8%EB%93%9C%ED%8F%B0%EC%BC%80%EC%9D%B4%EC%8A%A4&pagingIndex=2&pagingSize=40&productSet=total&query=%ED%95%B8%EB%93%9C%ED%8F%B0%EC%BC%80%EC%9D%B4%EC%8A%A4&sort=rel&timestamp=&viewType=list',
    'sbth': '0f5182f1eaeffb81e03a4287efca03680135c0777cf580e3456aad636af8b47097dd32dc7f0ee3a9c152fd02ebae6ce7',
    'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Google Chrome";v="119.0.6045.200", "Chromium";v="119.0.6045.200", "Not?A_Brand";v="24.0.0.0"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Windows"',
    'sec-ch-ua-platform-version': '"10.0.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
}

json_data = {
    'params': [
        {
            'nvMid': '86788178899',
            'chpid': '9243678576',
            'isBook': False,
        },
        {
            'nvMid': '43154469618',
            'chpid': None,
            'isBook': False,
        },
        {
            'nvMid': '86722503211',
            'chpid': '9178002888',
            'isBook': False,
        },
        {
            'nvMid': '40229214618',
            'chpid': None,
            'isBook': False,
        },
        {
            'nvMid': '85175362168',
            'chpid': '7630861846',
            'isBook': False,
        },
        {
            'nvMid': '85056420009',
            'chpid': '7511919687',
            'isBook': False,
        },
        {
            'nvMid': '86564320302',
            'chpid': '9019819979',
            'isBook': False,
        },
        {
            'nvMid': '44160227618',
            'chpid': None,
            'isBook': False,
        },
        {
            'nvMid': '84089335517',
            'chpid': '6544835184',
            'isBook': False,
        },
        {
            'nvMid': '86787063641',
            'chpid': '9242563318',
            'isBook': False,
        },
        {
            'nvMid': '43030319626',
            'chpid': None,
            'isBook': False,
        },
        {
            'nvMid': '29904044618',
            'chpid': None,
            'isBook': False,
        },
        {
            'nvMid': '42647503618',
            'chpid': None,
            'isBook': False,
        },
        {
            'nvMid': '43877738621',
            'chpid': None,
            'isBook': False,
        },
        {
            'nvMid': '85470288646',
            'chpid': '7925788323',
            'isBook': False,
        },
        {
            'nvMid': '85248406363',
            'chpid': '7703906041',
            'isBook': False,
        },
        {
            'nvMid': '85585361259',
            'chpid': '8040860936',
            'isBook': False,
        },
        {
            'nvMid': '85176663865',
            'chpid': '7632163543',
            'isBook': False,
        },
        {
            'nvMid': '86935019199',
            'chpid': '9390518876',
            'isBook': False,
        },
        {
            'nvMid': '86316918545',
            'chpid': '8772418222',
            'isBook': False,
        },
    ],
}

response = requests.post(
    'https://search.shopping.naver.com/api/product-zzim/products',
    cookies=cookies,
    headers=headers,
    json=json_data,
)

# Note: json_data will not be serialized by requests
# exactly as it was in the original request.
#data = '{"params":[{"nvMid":"86788178899","chpid":"9243678576","isBook":false},{"nvMid":"43154469618","chpid":null,"isBook":false},{"nvMid":"86722503211","chpid":"9178002888","isBook":false},{"nvMid":"40229214618","chpid":null,"isBook":false},{"nvMid":"85175362168","chpid":"7630861846","isBook":false},{"nvMid":"85056420009","chpid":"7511919687","isBook":false},{"nvMid":"86564320302","chpid":"9019819979","isBook":false},{"nvMid":"44160227618","chpid":null,"isBook":false},{"nvMid":"84089335517","chpid":"6544835184","isBook":false},{"nvMid":"86787063641","chpid":"9242563318","isBook":false},{"nvMid":"43030319626","chpid":null,"isBook":false},{"nvMid":"29904044618","chpid":null,"isBook":false},{"nvMid":"42647503618","chpid":null,"isBook":false},{"nvMid":"43877738621","chpid":null,"isBook":false},{"nvMid":"85470288646","chpid":"7925788323","isBook":false},{"nvMid":"85248406363","chpid":"7703906041","isBook":false},{"nvMid":"85585361259","chpid":"8040860936","isBook":false},{"nvMid":"85176663865","chpid":"7632163543","isBook":false},{"nvMid":"86935019199","chpid":"9390518876","isBook":false},{"nvMid":"86316918545","chpid":"8772418222","isBook":false}]}'
#response = requests.post(
#    'https://search.shopping.naver.com/api/product-zzim/products',
#    cookies=cookies,
#    headers=headers,
#    data=data,
#)
response.text

그러면 위의 결과처럼 잘 크롤링된 것을 확인할 수 있다.

 


 

사실 지금까지는 약간의 아쉬움이 있다.

network에서 기록된 여러 개의 products 중 한 개의 products만 가져오지 못했다.

 

내가 원하는 거는 한 페이지의 모든 찜의 개수를 가져오는 건데

저렇게 조금씩 찜을 가져오고 또 products의 값을 가져와 바꾸면 

후... 벌써 힘들어진다....

 

그래서 다음 포스터에는 어떻게 한 페이지 안에 모든 찜을 가져오는 방법에 대해 소개하겠다.

사실 이 포스터에 다 쓸려했는데.... 너무 길어짐 ㅎㅠㅎ

 

미리 스포어를 하면  nvMid만 알아가지고

for 문을 돌리면 끗 ~

생각보다 훨씬간단하다...!!

 

다음 포스터는 최대한 빨리... 업로드 하겠읍다!!  ^o^