전편에 네이버 스토어 정보들을
크롤링하는 법에 대해 포스터를 썼다.
(아직 selenium으로 크롤링하는 분 없길...)
selenium은 동적으로 해서 뭐든 크롤링하지만,
해당 창에 들어가고 웹 로딩도 기다리고....
이렇게 하면 시간이 저어엉 마아알 많이 든다.
나는 네이버 데이터들을 모으고 있는데
키워드만 약 5천 개다....
그러면 5천 개의 웹페이지를 로딩해야 하는데
이건 진짜 아니다 ㅠㅠ ( 그래도 손으로 하는 것보단 나음)
암튼 말이 좀 길어졌는데
웬만한 스토어의 정보는 전에 포스트 방식으로
다 가져올 수 있는데
"찜" 이 자슥만 좀 귀찮게 되어있다.
그래서 오늘은 "찜" 개수를 어떻게 가져오는지
포스팅을 할 예정이다.
전에 했던 기본 베이스들이 필요하기 때문에 모르는 분들은 아래 포스트 먼저!
본격적으로 크롤링 레츠기릿
먼저 크롤링을 잘하고 싶다?!
-> 개발자 도구의 network를 잘 보자
우선 아무 키워드나 검색해 본다.
개발자 도구로 network를 봐보자.
좌측 상단 빨간 버튼은 recode 버튼으로
저게 빨간불이 들어와야 기록이 된다.
아마 아무것도 모르는 상태로 network를 보면
하나같이 다 외계어로 느껴진다.
(기본 컴퓨터 지식이 있으면 훨씬 이해하기 좋다)
간단하게 말해 network는
내가 서버에 요청을 하여 필요 정보들을 제공받는데
그 과정들을 기록한 것이라 보면 된다.
우리가 필요한 거는 css적인 요소가 아니니까
이것만 필터링해도 훨씬 보기 편해진다.
다시 본론으로 돌아와 network의 변화를 유심히 살펴보자.
네이버 쇼핑은 비동기화 방식이어서
한 번에 모든 정보가 업로드되지 않는다.
스크롤을 계속 내리면 필요한 정보들을 서버에 요청을 해서 가져온다.
그 정보들은 network창에 새로 생기니 잘 살펴봐보자.
가장 눈에 띄는 products가 보인다. (이미지들은 볼 필요 없음)
products를 자세히 살펴보고 싶어서 products의 preview를 봤다.
preview에 보니 딕셔너리 형태로 key형식의 zzim이 있다 ㅋㅋㅋㅋ(단어 선택이 너무 직관적인 거 아니냐구)
사실누가 봐도 찜이지만....
혹시 모르니 1820을 찾아보니 역시나 찜이 맞다.
전에랑 똑같이 curl (bash)로 복사를 한 다음
아래 url에 들어가 붙여 넣으면 된다.
그러면 위의 사진처럼 파이썬 언어로 잘 변환해 주는데 그냥 이걸 그대로 복붙 해서 실행하면 된다.
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×tamp=&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^
'데이터 > 크롤링' 카테고리의 다른 글
[Python] 네이버 스토어 찜 크롤링 with requests _2탄 (1) | 2023.12.06 |
---|---|
네이버 크롤링 연결 제한 푸는법 (1) | 2023.11.30 |
[Python] requests로 네이버 데이터랩 크롤링 (0) | 2023.11.10 |
[Python] selenium 없이 스크롤 하는 법 (네이버쇼핑) (1) | 2023.10.15 |