11번가 인기검색어 크롤링 - str

11번가 쇼핑몰 json 데이터 가져오기

2008년 11번가 오픈을 하고 2017년쯤 매각하려고 했었죠!!
매각철회(안팔려서?)하고 2018년에 한국의 아마존을 만들겠다고 했으나... 뉴스{:target="_blank")

requests로 페이지 전체를 읽어서,
bs4로 크롤링해도 되지만..
보통 인기검색어 랭킹은 ajax등으로 따로 구현해놓는 경우가 많습니다.


개발자모드(F12)로 Network를 뒤져보니
찾아보니 역시나 랭킹을 제공하는 url이 있습니다.

https://www.11st.co.kr/AutoCompleteAjaxAction.tmall?method=getKeywordRankJson&type=hot&isSSL=Y&rankCnt=20&callback=fetchSearchRanking


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
fetchSearchRanking({
    "count": 20,
    "items": [{
        "keywordExtendInfo": "0:202:3/17발송! 국내정발",
        "rankUlOpen": true,
        "keyword": "오큘러스 퀘스트2",
        "explanation": "3/17발송! 국내정발",
        "currentRank": 1,
        "searchCount": "202",
        "rankOrder": "0",
        "rankUlClose": false,
        "pcSearchLink": "https://search.11st.co.kr/Search.tmall?kwd=%25EC%2598%25A4%25ED%2581%2598%25EB%259F%25AC%25EC%258A%25A4%2B%25ED%2580%2598%25EC%258A%25A4%25ED%258A%25B82",
        "top3": "top3"
    } {
        "keywordExtendInfo": "148:12:",
        "rankUlOpen": false,
        "keyword": "리큅 에어프라이어",  
        "explanation": "",
        "currentRank": 20,
        "searchCount": "12",
        "rankOrder": "148",
        "rankUlClose": true,
        "pcSearchLink": "https://search.11st.co.kr/Search.tmall?kwd=%25EB%25A6%25AC%25ED%2581%2585%2B%25EC%2597%2590%25EC%2596%25B4%25ED%2594%2584%25EB%259D%25BC%25EC%259D%25B4%25EC%2596%25B4",
        "top3": ""
    }],
    "updateTime": "2021.03.11 14:10"
})

Return 데이터는 json형태이지만 문자열이고, 20개의 랭킹을 불러오는 기능입니다.

keywordExtendInfo : 제품정보1
rankUlOpen : 상승/하락
keyword : 제품명
explanation : 제품정보
currentRank : 제품정보2
searchCount : 조회된 수
rankOrder : 랭크변화?
rankUlClose : 랭크변화아이콘??
pcSearchLink : 제품 검색 링크
top3 : top rank `위,2위, 3위 여부



requests 패키지 사용 인기검색어 가져오기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import json 
import requests

res = requests.get("https://www.11st.co.kr/AutoCompleteAjaxAction.tmall?method=getKeywordRankJson&type=hot&isSSL=Y&rankCnt=20&callback=fetchSearchRanking")

if res.status_code == 200:
    print(res.text[:200])
    print("current encoding : ",res.encoding)
    res.encoding = 'utf-8'
    print("current encoding : ", res.encoding)  
    res_text= res.text[res.text.find("({")+1:res.text.find("})")+1]     
    data = json.loads(res_text)

    for item in data['items']:
        print("keywordExtendInfo :  ", item['keywordExtendInfo'])
        print("rankUlOpen :             ", item['rankUlOpen'])
        print("keyword :                ", item['keyword'])
        print("explanation :            ", item['explanation'])
        print("currentRank :            ", item['currentRank'])
        print("searchCount :            ", item['searchCount'])
        print("rankOrder :              ", item['rankOrder'])
        print("rankUlClose :            ", item['rankUlClose'])
        print("pcSearchLink :           ", item['pcSearchLink'])
        print("top3 :                   ", item['top3'])
        quit()

결과:
fetchSearchRanking({"count":20,"items":[{"keywordExtendInfo":"0:198:십일절, 25%할인쿠폰","rankUlOpe...
current encoding : ISO-8859-1
current encoding : utf-8
keywordExtendInfo : 0:198:십일절, 25%할인쿠폰
rankUlOpen : True
keyword : 드시모네
explanation : 십일절, 25%할인쿠폰
currentRank : 1
searchCount : 198
rankOrder : 0
rankUlClose : False
pcSearchLink : https://search.11st.co.kr/Search.tmall?kwd=%25EB%2593%259C%25EC%258B%259C%25EB%25AA%25A8%25EB%2584%25A4
top3 : top3



가져온 데이터가 한글이 다 깨져서 encoding 으로 확인하니 ISO-8859-1 였습니다.
utf8변환하니 한글이 잘 나왔습니다.

json.loads를 이용하기 위해서 문자열을
json형태로 잘라서 이용했습니다.

위메프나 ak몰이랑 다르게 11번가는 손이 많이 갑니다.

요청 파라메터

파라메터에 rankCnt=100 으로 넣으면 랭킹 100개 나오네요..ㅎㅎ

requests 사용법
문자열 다루기


TAG: #11st #json #str #requests #crawling #11번가 #인기검색어