데이터/크롤링

[Python] selenium 없이 스크롤 하는 법 (네이버쇼핑)

Jerry_K 2023. 10. 15. 23:17
0          제모제
1       유아세탁세제
2       기저귀휴지통
3          카테킨
4         파우더통
         ...  
1607        잡화
1608        의류
1609        여성
1610        패션
1611        생활

 

이 keyword로 네이버 쇼핑에 검색 한 후 Top 100 정도의 가격을 구해 평균을 내보고 싶다.


가장 단순하게 시도를 먼저 해보자.

tmp = "키보드"
url = (" https://search.shopping.naver.com/search/all?frm=NVSCPRO&origQuery& "
       "pagingSize=80&"
       "&productSet=total&"
       f"query={tmp}&"
       "sort=rel&"
       "timestamp=&"
       "viewType=list")
headers={'User-agent': 'Mozilla/5.0'}

response = requests.get(url=url, headers=headers)
html = response.text
soup = BeautifulSoup(html,"html.parser")
lsts = soup.select(".product_price_area__eTg7I .price_num__S2p_v")
for lst in lsts:
    print(lst.text)

 

여기에서는 url의    "pagingSize=80&"   /  f"query={tmp}&"  이 부분만 잘 보면 될 듯하다.

pagtingSize = 80 은 80개의 목록까지 본다는 의미고 , query = " " 는 검색 키워드다. 

그래서 이 부분을 바꾸면 목록 개수라든지 query에 따라 검색이 달라진다. 

 

34,000원
12,400원

출력해보니 이런 결과 값이 나온다...

 

 

처음 검색을 하면 비동기식으로 웹이 작동해서 select가 2개 밖에 안되는 것이다.

스크롤을 내리면, select의 개수가 늘어난다. 

그렇다면 셀레니움을 쓰면되는데, 문제는 저 많은 keyword를 셀레니움으로해서 언제 다 처리하냐는 것...

그래서 requests만 이용해서 하는 법을 찾다가 딱 나와 같은 상황을 포스터 하신 분이 계셨다.  (맨 아래 링크 참고)

그 분께서 포스팅 하신거는 좀 예전꺼라 업뎃이 필요해서 기록용으로 업데이트 해본다.


selenium 없이 스크롤 하는 법 

크롤링을 잘하려면 Network를 잘 봐야하는 것 같다.  Network창을 키고 변화를 잘 지켜보자.

 

스크롤을 하니 porducts가 한개 늘었다.  문제는 스크롤하고 난뒤에 뜬거라 큰 의미가 없다. 

다른 방법으로 페이지에 변화를 주어 다른 변화들을 지켜보자. 

 

1페이지에서 2페이지로 넘어가니 all?eq=&iq=... 이런게 떴다.

 

 

Preview로 들어간다음 이것 저것 누르며 확인해봤고, ShoppingResult를 클릭해보니 내가 원하는 정보가 나오는거 같았다.

 

 

여기서 product를 눌러보니 스크롤을 안했는데도 json 형식으로 product값들을 가저왔다.

이거를 requests하고 json 형식으로 가져오면 끝이다. 

 

 

all?eq=&iq=... (우클릭) -> copy -> copy as cURL(bash)로 복사한다.

https://curlconverter.com/

 

Convert curl commands to code

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

curlconverter.com

그 다음 여기에 들어가 python형식으로 바꿔주면 된다.

 

 

이런 형식으로 cookies,headers,params 등의 코드로 변환 시켜주는데 그대로 복사한다.

 

 

import requests
import json

cookies = {
    'NNB': '6TTK2RJU3JPWG',
    'autocomplete': 'use',
    'AD_SHP_BID': '23',
    '_ga': 'GA1.2.1198469368.1669035888',
    'NV_WETR_LOCATION_RGN_M': '"MDUxMTAxMTE="',
    'ASID': '6f5bbfa400000184fa368e5f00000067',
    'SHP_BUCKET_ID': '4',
    'NV_WETR_LAST_ACCESS_RGN_M': '"MDUxMTAxMTE="',
    'NID_AUT': 'xDAIttoc1Atdn7rAs4Y+rogecRjh3p1xevXbJnm0Nr0CEioRQ5/hhmRFwExAG7+T',
    'NID_JKL': 'b+0nlz0gwdbCoxClpc3utji+0en89OQHe0BEDbaUv/Y=',
    'nx_ssl': '2',
    'Viking_Rise_visit_time': '1695077035991',
    'page_uid': 'ifYbMdprvTVsse385PlssssssE0-160453',
    'spage_uid': 'ifYbMdprvTVsse385PlssssssE0-160453',
    'NID_SES': 'AAABxneIb+UGNfkjN7HA2gA5OlFQfYJVR367v6fonQYo1gBA+STpwnmSQKvPHCtKl9cSOobgAMZTANOk4CCrBDXAZ+8+xr6VQ9Ezi+8ApV32H/Cwi7PkDkvMuZ3QqwE0RmlD2gBOkdM8F5e33pm7MmNSfpFFusRSCaFir0+c2j3yksaJFDdG9PWn6RxWHTn0JXWu880PKz+pLfdysAibvruAtoxZbtdsvNi3dzUkiI74c14ilruNwmeJ+WmNLRwD79YtsmBgjQd8yEFd2P1MbddwtdfBqqrvIg9mgVAbGhHj86VEjcOAN0a8W84w7vJnGqR5AvPZp6ANSE7LBBYR6BN4RjlHsqne/i39lWovcl8zlv3X//TRlaZFjsdpIdPtHtEPum7wMp0eB+7nLpwAd3Wqz3Ku7eVW9ZH+cwnQwPuLEr3cfZT1scFz3Evmwa4DZWtNXVbACznRMQbUJMYBaN6+kt/PjN932m5O5S1ked50/18fduz9Ga5UzgUJwG86kA2Yj6uX0EJtos8uyYEuUpkHRgKtLkWwSDzI/Qq1281rtR5EslmrYPIicx0eGzIfCGV22q72LUyRwqROGp75LdZlMcC6mJd95X42HzhYacCFvSyx',
    'sus_val': 'oosk3W1yUa/jXC7KKHHcV8KC',
    'ncpa': '5114254|lnq2oiag|6088f8339ff87318d5466310aa33bd3df5f4ee8e|s_21a15037d5896|4a037b7e1ad4f4b2b46b7552bf557d83d6e09c69:4801924|lnq2r5yw|252c45b5b1c89d88d92fb4fd42bf99065652c3d4|s_1aec08c8356c9|4a0769694c3e60ffa7b878ff1e700b5ee7a31a93:95694|lnq2t46o|8f47110d725d91bc72e3083c0376c78965d77ffe|95694|28deee716df4986a1bc2f535eccb8e15165491ff:114|lnrg1u34|6c1e428c1fdcf6109a6e368afd36c2c6547842b5|s_1f0b6dd34481|0d9a8a153a4fd6f9e60247ee72a897423e0d11c7',
}

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',
    # 'cookie': 'NNB=6TTK2RJU3JPWG; autocomplete=use; AD_SHP_BID=23; _ga=GA1.2.1198469368.1669035888; NV_WETR_LOCATION_RGN_M="MDUxMTAxMTE="; ASID=6f5bbfa400000184fa368e5f00000067; SHP_BUCKET_ID=4; NV_WETR_LAST_ACCESS_RGN_M="MDUxMTAxMTE="; NID_AUT=xDAIttoc1Atdn7rAs4Y+rogecRjh3p1xevXbJnm0Nr0CEioRQ5/hhmRFwExAG7+T; NID_JKL=b+0nlz0gwdbCoxClpc3utji+0en89OQHe0BEDbaUv/Y=; nx_ssl=2; Viking_Rise_visit_time=1695077035991; page_uid=ifYbMdprvTVsse385PlssssssE0-160453; spage_uid=ifYbMdprvTVsse385PlssssssE0-160453; NID_SES=AAABxneIb+UGNfkjN7HA2gA5OlFQfYJVR367v6fonQYo1gBA+STpwnmSQKvPHCtKl9cSOobgAMZTANOk4CCrBDXAZ+8+xr6VQ9Ezi+8ApV32H/Cwi7PkDkvMuZ3QqwE0RmlD2gBOkdM8F5e33pm7MmNSfpFFusRSCaFir0+c2j3yksaJFDdG9PWn6RxWHTn0JXWu880PKz+pLfdysAibvruAtoxZbtdsvNi3dzUkiI74c14ilruNwmeJ+WmNLRwD79YtsmBgjQd8yEFd2P1MbddwtdfBqqrvIg9mgVAbGhHj86VEjcOAN0a8W84w7vJnGqR5AvPZp6ANSE7LBBYR6BN4RjlHsqne/i39lWovcl8zlv3X//TRlaZFjsdpIdPtHtEPum7wMp0eB+7nLpwAd3Wqz3Ku7eVW9ZH+cwnQwPuLEr3cfZT1scFz3Evmwa4DZWtNXVbACznRMQbUJMYBaN6+kt/PjN932m5O5S1ked50/18fduz9Ga5UzgUJwG86kA2Yj6uX0EJtos8uyYEuUpkHRgKtLkWwSDzI/Qq1281rtR5EslmrYPIicx0eGzIfCGV22q72LUyRwqROGp75LdZlMcC6mJd95X42HzhYacCFvSyx; sus_val=oosk3W1yUa/jXC7KKHHcV8KC; ncpa=5114254|lnq2oiag|6088f8339ff87318d5466310aa33bd3df5f4ee8e|s_21a15037d5896|4a037b7e1ad4f4b2b46b7552bf557d83d6e09c69:4801924|lnq2r5yw|252c45b5b1c89d88d92fb4fd42bf99065652c3d4|s_1aec08c8356c9|4a0769694c3e60ffa7b878ff1e700b5ee7a31a93:95694|lnq2t46o|8f47110d725d91bc72e3083c0376c78965d77ffe|95694|28deee716df4986a1bc2f535eccb8e15165491ff:114|lnrg1u34|6c1e428c1fdcf6109a6e368afd36c2c6547842b5|s_1f0b6dd34481|0d9a8a153a4fd6f9e60247ee72a897423e0d11c7',
    'logic': 'PART',
    'referer': 'https://search.shopping.naver.com/search/all?frm=NVSCPRO&origQuery&pagingSize=80&&productSet=total&query=%EC%84%B8%EC%A0%9C&sort=rel&timestamp=&viewType=list',
    'sbth': 'd222b49238bd2b7f29803e2ed2f08d01eedaa3d14d24417197e36287d8d5eae0ca4c01288a05847bfed167eb56487188',
    'sec-ch-ua': '"Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Chromium";v="118.0.5993.70", "Google Chrome";v="118.0.5993.70", "Not=A?Brand";v="99.0.0.0"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Windows"',
    'sec-ch-ua-platform-version': '"15.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/118.0.0.0 Safari/537.36',
}

params = {
    'frm': 'NVSCPRO',
    'pagingIndex': '1',
    'pagingSize': '100',
    'productSet': 'total',
    f'query': "키보드",
    'sort': 'rel',
    'viewType': 'list',
}

response = requests.get('https://search.shopping.naver.com/api/search/all', params=params, cookies=cookies, headers=headers)
itemlist = json.loads(response.text)

sum = 0
for idx,i in enumerate(itemlist['shoppingResult']['products']):
    price = i['price'],
    price =  int(price[0])
    sum += price


avg = sum / len(itemlist['shoppingResult']['products'])
print(f"키보드 : {avg}")

 

 

키보드 : 102593.9

url에 넣은다음 response하고 json.loads로 json 형식으로  가져온다.

json형식으로 가져온 값을 잘 인덱싱해서 원하는 값을 출력한다. 

키워드를 바꾸고 싶으면 query의 값을 바꾸면 되고, 페이지 번호를 바꾸고 싶으면 pagingIndex를, 페이지 목록을 많이 가져오고 싶으면 pagingSize를 수정하면된다.  

저 위에  params의 딕셔너리들을 이러쿵 저러쿵 잘 수정하면 원하는 값들을 원하는 만큼 출력 가능 하다.

 

cookies,headers,params 에 필요없는 것들은 지워도 된다. (필요 없는 것 확인은 제거한 url을 검색해서 원하는 창이 나오는지 확인하면 된다.)

 

참고. len(itemlist['shoppingResult']['products']) 하면 100개가 나옴 (최대 100개)


이걸 셀레니움하면 컴퓨터도 열 받을 상황이지만, json형식으로 requests하니 1600개 데이터를 10분만에 다 처리했던거 같다. json형식으로 불러오는건 처음이라 다음에 또 까먹을까봐 기록함 

 

 

 

https://kwonkyo.tistory.com/529#gsc.tab=0

 

selenium사용하지 않고 네이버쇼핑 검색결과 크롤링하기

네이버 쇼핑의 검색 결과가 필요해졌습니다. 검색 페이지 크롤링하면 되니까 어렵지 않게 할 수 있을 거라고 생각했었는데 그게 아니었습니다. 대신 검색정보를 담고 있는 JSON파일을 찾을 수 있

kwonkyo.tistory.com

이분꺼 참고하면 더 좋음 (근데 좀 예전꺼라 name은 제꺼 참고하는게 좋을 듯 합니다.)