728x90
반응형
안녕하세요 늑대양입니다 :)
오늘은 [AI 데이터 사이언티스트 취업 완성 과정]의 12일차 일과를 정리하여 안내해드리도록 하겠습니다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif)
Day 12. 시간표:
- 오프라인 강의: [웹크롤링 실전 : Python]
- 랜덤 조별 회고
- 복습 및 온라인 학습
- 선택학습
Day 12. 웹크롤링 실전 : Python
여러 종목의 시가총액, 외국인 소진율, PER, PBR 한꺼번에 가져오기:
# 데이터 초기화 및 가져오기
data_list = []
code_list = ['097950', '010620', '005930']
name_list = []
# url 정의
for code in code_list:
url = f'https://finance.naver.com/item/main.naver?code={code}'
# print(url)
print(f"{code} 크롤링 중")
# 코드 지연을 통한 차단 방지
seed = np.random.randint(100)
np.random.seed(seed)
a = np.random.randint(5)
time.sleep(a)
# requests 요청시에 헤더정보 추가
resp = requests.get(url)
# html 변환
html = BeautifulSoup(resp.text)
# 정보선별
# 시가총액, 외국인소진률, PER, PBR
# 시가총액
data_list.append(html.select('em#_market_sum')[0].text.replace('\n', '').replace('\t', ''))
# 외국인소진율(경로셀렉터)
data_list.append(html.select('tr.strong em')[1].text)
# per
if html.select('em#_per') == []:
data_list.append(np.nan)
# data_list.append(html.select('table.per_table em')[0].text)
else:
data_list.append(html.select('em#_per')[0].text)
# pbr
data_list.append(html.select('em#_pbr')[0].text)
# html.select('em#_pbr')[0].text
# 종목명
name_list.append(html.select('h2 a')[0].text)
print("크롤링 완료!")
>097950 크롤링 중
010620 크롤링 중
005930 크롤링 중
크롤링 완료!
# 결과 확인
print(data_list)
print(name_list)
>['5조9,840', '24.60%', '10.03', '0.94', '4조2,538', '19.26%', nan, '1.96', '340조2,776', '49.72%', '8.65', '1.21']
['CJ제일제당', '현대미포조선', '삼성전자']
# numpy 활용
data = np.array(data_list).reshape(-1, 4)
data
>array([['5조9,840', '24.60%', '10.03', '0.94'],
['4조2,538', '19.26%', 'nan', '1.96'],
['340조2,776', '49.72%', '8.65', '1.21']], dtype='<U32')
# df 제작
df = pd.DataFrame(data,
index=name_list,
columns=['시가총액', '외국인소진율', 'PER', 'PBR'])
df
>
시가총액 외국인소진율 PER PBR
CJ제일제당 5조9,840 24.60% 10.03 0.94
현대미포조선 4조2,538 19.26% nan 1.96
삼성전자 340조2,776 49.72% 8.65 1.21
동적페이지 크롤링:
- 최근에는 Js로 변경이 되며 일반적인 크롤링이 되지 않는 경우가 많음!
- 동적페이지와 숨겨진 url을 가져오는 방법을 알아봅니다!
동적페이지 확인:
개발자도구 > 네트워크 탭 > 클리어 > 탭 넘기며 확인
# 동적페이지의 숨은 URL 크롤링
# 동적페이지에 요청을 할 때 웹 정책에 필요한 정보를 같이 전달을 해줘야 함.
# url 정의
url = "https://finance.naver.com/item/sise.naver?code=005930&page=1"
header = {
"referer" : "https://finance.naver.com/item/fchart.naver?code=005930",
"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 레퍼러정보: 유저가 해당페이지에 요청하기 전 머물렀던 이전 페이지 주소
# 유저에이전트: 로컬컴퓨터 브라우저 사양 (로봇이냐 아니냐)
# requests 요청시에 헤더정보 추가
resp = requests.get(url, headers=header)
# html 변환
html = BeautifulSoup(resp.text, 'html.parser')
# 정보선별
info = html.select('body table tbody')[0].text
info = info.replace('\n', '')
info = info.replace('\t', '')
info = info.replace('l', ' ')
print(info)
>현재가57,100매도호가57,200전일대비0매수호가57,100등락률(%)0.00%전일가57,100거래량7,419,198시가57,200거래대금(백만)424,356고가57,600액면가100원저가56,900상한가74,200전일상한74,700하한가40,000전일하한40,300PER8.66EPS6,59352주 최고80,80052주 최저55,700시가총액3,408,746억원상장주식수5,969,782,550외국인현재2,968,024천주자본금778,046백만
# 다른 풀이 방법
# 동적페이지의 숨은 URL
# 동적페이지에 요청을 할 때 웹 정책에 필요한 정보를 같이 전달을 해줘야 함.
data_list = []
# url 정의
url = "https://finance.naver.com/item/sise_day.naver?code=005930&page=1"
header = {
"referer" : "https://finance.naver.com/item/fchart.naver?code=005930",
"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 레퍼러정보: 유저가 해당페이지에 요청하기 전 머물렀던 이전 페이지 주소
# 유저에이전트: 로컬컴퓨터 브라우저 사양 (로봇이냐 아니냐)
# requests 요청시에 헤더정보 추가
resp = requests.get(url, headers=header)
resp.text
# html 변환
html = BeautifulSoup(resp.text, 'html.parser')
# 정보선별
for item in html.select('span.tah'): #tah p10 gray03
data_list.append(item.text.strip().replace(',', ''))
# data_list
# list comprehension 활용
col_nm = [item.text for item in html.select('th')]
# col_nm
# numpy 활용
data = np.array(data_list).reshape(-1, 7)
# data
# DataFrame 활용
df = pd.DataFrame(data,
columns=col_nm)
df.set_index('날짜', inplace=True)
df
>
종가 전일비 시가 고가 저가 거래량
날짜
2022.09.06 57100 0 57200 57600 56900 7439533
2022.09.05 57100 400 57400 57800 56800 11425977
2022.09.02 57500 900 58300 58600 57500 15040310
2022.09.01 58400 1300 58700 58900 58300 14905777
2022.08.31 59700 900 58200 59900 58200 14203512
2022.08.30 58800 200 58700 59000 58300 9690044
2022.08.29 58600 1400 58700 58900 58600 9841329
2022.08.26 60000 300 60300 60900 59900 9499995
2022.08.25 59700 700 59200 59700 59000 5767902
2022.08.24 59000 100 59200 59500 59000 8888486
JSON 파싱:
- 동적페이지 크롤링의 경우에는 일반적인 HTML text 형태의 데이터만을 사용하지 않습니다.
- JSON, xml 형식의 데이터도 통신에 사용하기에 요청결과값에 따른 처리가 필요합니다.
# json
import json
# url 설정
url = "https://finance.daum.net/api/quote/A005930/days?symbolCode=A005930&page=1&perPage=10&pagination=true"
# header 설정
header = {
"referer": "https://finance.daum.net/quotes/A005930",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# response 설정
resp = requests.get(url, headers=header)
# resp.text는 꼭 확인!!
resp.text
# json.loads() 활용
data = json.loads(resp.text)
# data 확인
# 리스트 안에 딕셔너리 > json 포맷
data['data']
>
[{'symbolCode': 'A005930',
'date': '2022-09-06 15:30:28',
'tradePrice': 57100.0,
'tradeTime': '15:30:28',
'change': 'EVEN',
'changePrice': 0.0,
'changeRate': 0,
'prevClosingPrice': 57100.0,
'exchangeCountry': 'KOREA',
'openingPrice': 57200.0,
'highPrice': 57600.0,
'lowPrice': 56900.0,
'accTradePrice': 425517519600,
'accTradeVolume': 7439533,
'periodTradePrice': 425517519600,
'periodTradeVolume': 7439533,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-09-05 15:30:03',
'tradePrice': 57100.0,
'tradeTime': '15:30:03',
'change': 'FALL',
'changePrice': 400.0,
'changeRate': -0.0069565217,
'prevClosingPrice': 57500.0,
'exchangeCountry': 'KOREA',
'openingPrice': 57400.0,
'highPrice': 57800.0,
'lowPrice': 56800.0,
'accTradePrice': 653884056584,
'accTradeVolume': 11425977,
'periodTradePrice': 653884056584,
'periodTradeVolume': 11425977,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-09-02 15:30:19',
'tradePrice': 57500.0,
'tradeTime': '15:30:19',
'change': 'FALL',
'changePrice': 900.0,
'changeRate': -0.0154109589,
'prevClosingPrice': 58400.0,
'exchangeCountry': 'KOREA',
'openingPrice': 58300.0,
'highPrice': 58600.0,
'lowPrice': 57500.0,
'accTradePrice': 872040367551,
'accTradeVolume': 15040310,
'periodTradePrice': 872040367551,
'periodTradeVolume': 15040310,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-09-01 15:30:03',
'tradePrice': 58400.0,
'tradeTime': '15:30:03',
'change': 'FALL',
'changePrice': 1300.0,
'changeRate': -0.0217755444,
'prevClosingPrice': 59700.0,
'exchangeCountry': 'KOREA',
'openingPrice': 58700.0,
'highPrice': 58900.0,
'lowPrice': 58300.0,
'accTradePrice': 872374620601,
'accTradeVolume': 14905777,
'periodTradePrice': 872374620601,
'periodTradeVolume': 14905777,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-08-31 15:30:05',
'tradePrice': 59700.0,
'tradeTime': '15:30:05',
'change': 'RISE',
'changePrice': 900.0,
'changeRate': 0.0153061224,
'prevClosingPrice': 58800.0,
'exchangeCountry': 'KOREA',
'openingPrice': 58200.0,
'highPrice': 59900.0,
'lowPrice': 58200.0,
'accTradePrice': 841319635900,
'accTradeVolume': 14203512,
'periodTradePrice': 841319635900,
'periodTradeVolume': 14203512,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-08-30 15:30:08',
'tradePrice': 58800.0,
'tradeTime': '15:30:08',
'change': 'RISE',
'changePrice': 200.0,
'changeRate': 0.0034129693,
'prevClosingPrice': 58600.0,
'exchangeCountry': 'KOREA',
'openingPrice': 58700.0,
'highPrice': 59000.0,
'lowPrice': 58300.0,
'accTradePrice': 567627668500,
'accTradeVolume': 9690044,
'periodTradePrice': 567627668500,
'periodTradeVolume': 9690044,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-08-29 15:30:16',
'tradePrice': 58600.0,
'tradeTime': '15:30:16',
'change': 'FALL',
'changePrice': 1400.0,
'changeRate': -0.0233333333,
'prevClosingPrice': 60000.0,
'exchangeCountry': 'KOREA',
'openingPrice': 58700.0,
'highPrice': 58900.0,
'lowPrice': 58600.0,
'accTradePrice': 577684200900,
'accTradeVolume': 9841329,
'periodTradePrice': 577684200900,
'periodTradeVolume': 9841329,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-08-26 15:30:25',
'tradePrice': 60000.0,
'tradeTime': '15:30:25',
'change': 'RISE',
'changePrice': 300.0,
'changeRate': 0.0050251256,
'prevClosingPrice': 59700.0,
'exchangeCountry': 'KOREA',
'openingPrice': 60300.0,
'highPrice': 60900.0,
'lowPrice': 59900.0,
'accTradePrice': 573040309950,
'accTradeVolume': 9499995,
'periodTradePrice': 573040309950,
'periodTradeVolume': 9499995,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-08-25 15:30:15',
'tradePrice': 59700.0,
'tradeTime': '15:30:15',
'change': 'RISE',
'changePrice': 700.0,
'changeRate': 0.0118644068,
'prevClosingPrice': 59000.0,
'exchangeCountry': 'KOREA',
'openingPrice': 59200.0,
'highPrice': 59700.0,
'lowPrice': 59000.0,
'accTradePrice': 342780937200,
'accTradeVolume': 5767902,
'periodTradePrice': 342780937200,
'periodTradeVolume': 5767902,
'listedSharesCount': None},
{'symbolCode': 'A005930',
'date': '2022-08-24 15:30:16',
'tradePrice': 59000.0,
'tradeTime': '15:30:16',
'change': 'FALL',
'changePrice': 100.0,
'changeRate': -0.0016920474,
'prevClosingPrice': 59100.0,
'exchangeCountry': 'KOREA',
'openingPrice': 59200.0,
'highPrice': 59500.0,
'lowPrice': 59000.0,
'accTradePrice': 525406965200,
'accTradeVolume': 8888486,
'periodTradePrice': 525406965200,
'periodTradeVolume': 8888486,
'listedSharesCount': None}]
# DataFrame 활용
df = pd.DataFrame(data['data'])
df
>
symbolCode date tradePrice tradeTime change changePrice changeRate prevClosingPrice exchangeCountry openingPrice highPrice lowPrice accTradePrice accTradeVolume periodTradePrice periodTradeVolume listedSharesCount
0 A005930 2022-09-06 15:30:28 57100.0 15:30:28 EVEN 0.0 0.000000 57100.0 KOREA 57200.0 57600.0 56900.0 425517519600 7439533 425517519600 7439533 None
1 A005930 2022-09-05 15:30:03 57100.0 15:30:03 FALL 400.0 -0.006957 57500.0 KOREA 57400.0 57800.0 56800.0 653884056584 11425977 653884056584 11425977 None
2 A005930 2022-09-02 15:30:19 57500.0 15:30:19 FALL 900.0 -0.015411 58400.0 KOREA 58300.0 58600.0 57500.0 872040367551 15040310 872040367551 15040310 None
3 A005930 2022-09-01 15:30:03 58400.0 15:30:03 FALL 1300.0 -0.021776 59700.0 KOREA 58700.0 58900.0 58300.0 872374620601 14905777 872374620601 14905777 None
4 A005930 2022-08-31 15:30:05 59700.0 15:30:05 RISE 900.0 0.015306 58800.0 KOREA 58200.0 59900.0 58200.0 841319635900 14203512 841319635900 14203512 None
5 A005930 2022-08-30 15:30:08 58800.0 15:30:08 RISE 200.0 0.003413 58600.0 KOREA 58700.0 59000.0 58300.0 567627668500 9690044 567627668500 9690044 None
6 A005930 2022-08-29 15:30:16 58600.0 15:30:16 FALL 1400.0 -0.023333 60000.0 KOREA 58700.0 58900.0 58600.0 577684200900 9841329 577684200900 9841329 None
7 A005930 2022-08-26 15:30:25 60000.0 15:30:25 RISE 300.0 0.005025 59700.0 KOREA 60300.0 60900.0 59900.0 573040309950 9499995 573040309950 9499995 None
8 A005930 2022-08-25 15:30:15 59700.0 15:30:15 RISE 700.0 0.011864 59000.0 KOREA 59200.0 59700.0 59000.0 342780937200 5767902 342780937200 5767902 None
9 A005930 2022-08-24 15:30:16 59000.0 15:30:16 FALL 100.0 -0.001692 59100.0 KOREA 59200.0 59500.0 59000.0 525406965200 8888486 525406965200 8888486 None
네이버 데이터랩 인기검색어 크롤링:
# 패션의류 카테고리 숨은 url 찾고 데이터 요청하고 데이터타입에 따라 변환까지!
# url 및 header 정보 설정
url = "https://datalab.naver.com/shoppingInsight/getKeywordRank.naver?timeUnit=date&cid=50000000"
header = {
"referer" : "https://datalab.naver.com/home/sectionSearch.naver",
"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# response 설정
resp = requests.post(url, headers=header)
resp.text
# json 데이터 로드
data = json.loads(resp.text)
data
>[{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/08/25',
'datetime': '2022.08.25.(목)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 3, 'keyword': '스포츠브라', 'linkId': '스포츠브라'},
{'rank': 4, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 5, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 6, 'keyword': '디키즈874', 'linkId': '디키즈874'},
{'rank': 7, 'keyword': '잠옷', 'linkId': '잠옷'},
{'rank': 8, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 9, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 10, 'keyword': '여성속옷', 'linkId': '여성속옷'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/08/26',
'datetime': '2022.08.26.(금)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 3, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 4, 'keyword': '스포츠브라', 'linkId': '스포츠브라'},
{'rank': 5, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 6, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 7, 'keyword': '트위드자켓', 'linkId': '트위드자켓'},
{'rank': 8, 'keyword': '보정팬티', 'linkId': '보정팬티'},
{'rank': 9, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 10, 'keyword': '잠옷', 'linkId': '잠옷'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/08/27',
'datetime': '2022.08.27.(토)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 3, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 4, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 5, 'keyword': '보정속옷', 'linkId': '보정속옷'},
{'rank': 6, 'keyword': '스판팬티', 'linkId': '스판팬티'},
{'rank': 7, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 8, 'keyword': '스포츠브라', 'linkId': '스포츠브라'},
{'rank': 9, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 10, 'keyword': '가디건', 'linkId': '가디건'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/08/28',
'datetime': '2022.08.28.(일)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 3, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 4, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 5, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 6, 'keyword': '스포츠브라', 'linkId': '스포츠브라'},
{'rank': 7, 'keyword': '나이키바람막이', 'linkId': '나이키바람막이'},
{'rank': 8, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 9, 'keyword': '트위드자켓', 'linkId': '트위드자켓'},
{'rank': 10, 'keyword': '가디건', 'linkId': '가디건'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/08/29',
'datetime': '2022.08.29.(월)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 3, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 4, 'keyword': '나이키바람막이', 'linkId': '나이키바람막이'},
{'rank': 5, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 6, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 7, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 8, 'keyword': '스포츠브라', 'linkId': '스포츠브라'},
{'rank': 9, 'keyword': '가디건', 'linkId': '가디건'},
{'rank': 10, 'keyword': '바람막이', 'linkId': '바람막이'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/08/30',
'datetime': '2022.08.30.(화)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 3, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 4, 'keyword': '나이키바람막이', 'linkId': '나이키바람막이'},
{'rank': 5, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 6, 'keyword': '바람막이', 'linkId': '바람막이'},
{'rank': 7, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 8, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 9, 'keyword': '가디건', 'linkId': '가디건'},
{'rank': 10, 'keyword': '트위드자켓', 'linkId': '트위드자켓'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/08/31',
'datetime': '2022.08.31.(수)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 3, 'keyword': '나이키바람막이', 'linkId': '나이키바람막이'},
{'rank': 4, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 5, 'keyword': '바람막이', 'linkId': '바람막이'},
{'rank': 6, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 7, 'keyword': '가디건', 'linkId': '가디건'},
{'rank': 8, 'keyword': '트위드자켓', 'linkId': '트위드자켓'},
{'rank': 9, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 10, 'keyword': '여성가디건', 'linkId': '여성가디건'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/09/01',
'datetime': '2022.09.01.(목)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 3, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 4, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 5, 'keyword': '나이키바람막이', 'linkId': '나이키바람막이'},
{'rank': 6, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 7, 'keyword': '팬츠', 'linkId': '팬츠'},
{'rank': 8, 'keyword': '트위드자켓', 'linkId': '트위드자켓'},
{'rank': 9, 'keyword': '가디건', 'linkId': '가디건'},
{'rank': 10, 'keyword': '바람막이', 'linkId': '바람막이'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/09/02',
'datetime': '2022.09.02.(금)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 3, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 4, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 5, 'keyword': '여성팬티', 'linkId': '여성팬티'},
{'rank': 6, 'keyword': '맨투맨', 'linkId': '맨투맨'},
{'rank': 7, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 8, 'keyword': '남자청바지', 'linkId': '남자청바지'},
{'rank': 9, 'keyword': '팬츠', 'linkId': '팬츠'},
{'rank': 10, 'keyword': '후드집업', 'linkId': '후드집업'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/09/03',
'datetime': '2022.09.03.(토)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 3, 'keyword': '여성팬티', 'linkId': '여성팬티'},
{'rank': 4, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 5, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 6, 'keyword': '후드집업', 'linkId': '후드집업'},
{'rank': 7, 'keyword': '트위드자켓', 'linkId': '트위드자켓'},
{'rank': 8, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 9, 'keyword': '팬츠', 'linkId': '팬츠'},
{'rank': 10, 'keyword': '잠옷', 'linkId': '잠옷'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/09/04',
'datetime': '2022.09.04.(일)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '여성팬티', 'linkId': '여성팬티'},
{'rank': 3, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 4, 'keyword': '잠옷', 'linkId': '잠옷'},
{'rank': 5, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 6, 'keyword': '맨투맨', 'linkId': '맨투맨'},
{'rank': 7, 'keyword': '트위드자켓', 'linkId': '트위드자켓'},
{'rank': 8, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 9, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 10, 'keyword': '우비', 'linkId': '우비'}]},
{'message': None,
'statusCode': 200,
'returnCode': 0,
'date': '2022/09/05',
'datetime': '2022.09.05.(월)',
'range': '',
'ranks': [{'rank': 1, 'keyword': '원피스', 'linkId': '원피스'},
{'rank': 2, 'keyword': '우비', 'linkId': '우비'},
{'rank': 3, 'keyword': '맨투맨', 'linkId': '맨투맨'},
{'rank': 4, 'keyword': '가을원피스', 'linkId': '가을원피스'},
{'rank': 5, 'keyword': '잠옷', 'linkId': '잠옷'},
{'rank': 6, 'keyword': '남자팬티', 'linkId': '남자팬티'},
{'rank': 7, 'keyword': '여성잠옷', 'linkId': '여성잠옷'},
{'rank': 8, 'keyword': '반팔티', 'linkId': '반팔티'},
{'rank': 9, 'keyword': '여성팬티', 'linkId': '여성팬티'},
{'rank': 10, 'keyword': '후드집업', 'linkId': '후드집업'}]}]
# date 확인
date = data[1]['date']
date
>'2022/08/26'
# DataFrame 활용
df = pd.DataFrame(data[1]['ranks'])
df
>
rank keyword linkId
0 1 원피스 원피스
1 2 남자팬티 남자팬티
2 3 여성잠옷 여성잠옷
3 4 스포츠브라 스포츠브라
4 5 가을원피스 가을원피스
5 6 반팔티 반팔티
6 7 트위드자켓 트위드자켓
7 8 보정팬티 보정팬티
8 9 후드집업 후드집업
9 10 잠옷 잠옷
crwaler_movie_ex 예제
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif)
긴 글 읽어주셔서 감사합니다 :)
728x90
반응형
'AI > [부트캠프] 데이터 사이언티스트 과정' 카테고리의 다른 글
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 14. (0) | 2022.09.08 |
---|---|
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 13. (0) | 2022.09.07 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 11. (0) | 2022.09.05 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 10. (0) | 2022.09.02 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 9. (0) | 2022.09.01 |