어제 Kakao API에 이어 오늘은 Naver API를 사용해 본다!!


https://developers.naver.com 여기에서 app 등록하여 key를 획득하여 데이터를 가져와야 한다.

이런식으로 Client ID와 Client Secret을 가져온다.
# 1. App Key 얻기: http://localhost 으로 URL 사용함
CLIENT_ID, CLIENT_SECRET = 'mkdP1lOXXiHZjKxRVszT', 'KxJHnMXR**'
# 2. document: url(params, headers)
url = 'https://openapi.naver.com/v1/datalab/search'
params = {
'startDate': '2018-01-01', # 조회 기간 시작 날짜
'endDate': '2024-03-01', # 조회 기간 종료 날짜
'timeUnit': 'month', # 구간 단위
'keywordGroups' : [
{'groupName': '트위터', 'keywords': ['트위터', '트윗']},
{'groupName': '페이스북', 'keywords': ['페이스북', '페북']},
{'groupName': '인스타그램', 'keywords': ['인스타그램', '인스타']}
],
}
header = {
'X-Naver-Client-Id': CLIENT_ID,
'X-Naver-Client-Secret': CLIENT_SECRET,
'Content-Type': 'application/json'
}
# 3. request(url: params, headers) > response: json(str)
response = requests.post(url, json.dumps(params), headers=header)
# 4. json(str) > list, dict : DataFrame 생성
data = response.json()['results']
# 5. 데이터프레임으로 변경
dfs = []
for row in data:
df = pd.DataFrame(row['data'])
df['title'] = row['title']
dfs.append(df)
result= pd.concat(dfs, ignore_index=True)
result.tail()



addr = '망원동'
url = f'https://apis.zigbang.com/v2/search?leaseYn=N&q={addr}&serviceType=원룸'
response = requests.get(url)
# response.json()['items']가 리스트로 출력되어 0번째 데이터 가져옴
data = response.json()['items'][0]
lat, lng = data['lat'], data['lng']
lat, lng

pip install geohash2 # 라이브러리 설치
import geohash2
# precision 숫자가 클 수록 영역이 작아짐
geohash = geohash2.encode(lat, lng, precision=5)
geohash
>
'wydjx'

# url 저장
url = f'https://apis.zigbang.com/v2/items/oneroom\
?geohash={geohash}&depositMin=0&rentMin=0&salesTypes[0]=전세&salesTypes[1]=월세\
&domain=zigbang&checkAnyItemWithoutFilter=true'
response = requests.get(url) # Get방식으로 불러오기
items = response.json()['items'] # items변수에 items속성 저장
items = [item['itemId'] for item in items]

# list에서 가져옴 url
url = 'https://apis.zigbang.com/v2/items/list'
# payload 탭에 가면 있음
params = {
'domain' : 'zigbang',
'item_ids' : items
}
# response = response.post(url, json.dumps(params)) # 한글이 params에 없기 때문에 안해줘도 된다
response = requests.post(url, params)
pd.options.display.max_columns = 40 # 제한을 40으로 함, row도 가능
# json 형식으로 불러오기
data = response.json()['items']
# dataframe으로 변경
df = pd.DataFrame(data)
# 컬럼 확인
data = response.json()['items']
columns = ['item_id', 'sales_title', 'deposit', 'rent', 'size_m2', 'floor', 'title','address1']
df = pd.DataFrame(data)[columns]
# 마무리
df = df[df['address1'].str.contains('망원동')].reset_index(drop=True)
%%html
<div id = 'contents' class='wrap'>
<button class = 'btn no1' type = 'button' value = '1'>Btn1</button>
<button class = 'btn no2' type = 'button' value = '2'>Btn2</button>
</div>

<head></head>%%html
<h1>제목</h1>
<h3>제목</h3>
<h5>제목</h5>

<p></p>%%html
<p>한 줄의 정보를 담음</p>
<p>가장 많이 쓴다</p>

<span></span>%%html
<span>한 줄이 아닌 한 블럭으로 데이터 출력</span>
<span>이렇게 연결이 된다</span>

<pre></pre>%%html
<pre>
이렇게
띄어서 표시가 가능함
탭도 가능
</pre>

<code></code>%%html
<code>
코드로 나옴 신기해٩( ᐛ )و
</code>

<div></div>%%html
<div>
<div>div1</div>
<div>div2</div>
</div>
<div>div3</div>
<table></table>%%html
<table>
<caption>테이블제목</caption>
<thead>
<tr>
<th>table1</th> <!-- th랑 td 같음-->
<th>table2</th>
</tr>
</thead>
<tbody>
<tr>
<td>data1</td>
<td>data2</td>
</tr>
<tr>
<td>data3</td>
<td>data4</td>
</tr>
</tbody>
</table>

<ul></ul>, <li></li>%%html
<ul>
<li>data1</li>
<li>data2</li>
</ul>

<a></a>target="_blank"는 링크를 열때 새탭에서 열도록 하는 기능이 있음%%html
<a href='https://kt.com' target='_blank'>Move KT</a>
<!--target='_blank'는 새탭을 열어서 함-->
<image></image>%%html
<img src='https://cfm.kt.com/images/v2/layout/gnb-ktlogo.png' alt='kt logo'></img>
<!-- alt='' 글자로 이미지 말해줌 -->

<iframe></iframe>%%html
<iframe src='https://kt.com' width='100%' height='200px'></iframe>

<input></input># text
%%html
<input type='text' placeholder='이메일'></input>

# password
%%html
<input type='password' placeholder='비밀번호'></input>

# radio
%%html
<input type='radio' name='no1'>btn 1</input>
<input type='radio' name='no1'>btn 2</input>
<input type='radio' name='no2'>btn 3</input>
<input type='radio' name='no2'>btn 4</input>
<!-- name='no1'으로 그룹 나눔-->

# checkbox
%%html
<input type='checkbox' name='no1'>btn 1</input>
<input type='checkbox' name='no1'>btn 2</input>

# select, option
%%html
<select>
<option>opt1</option>
<option>opt2</option>
<option>opt3</option>
</select>

# textarea
%%html
<textarea rows='4' cols='50'></textarea>

# button
%%html
<button class = 'btn no1' type = 'button' value = '1'>Btn1</button>
<button class = 'btn no2' type = 'button' value = '2'>Btn2</button>

div를 사용하면 가장 위에 있는 dss1이 선택%%html
<div>dss1</div>
<p>dss2</p>
<span>dss3</span>
# dom.select_one('div') => dss1
#(아이디 이름)으로 선택#ds2를 사용하면 dss2가 선택#ds2, #ds3를 사용하면 dss2와 dss3가 선택<p id="ds1">dss1</p>
<p id="ds2">dss2</p>
<p id="ds3">dss3</p>
# dom.select_one('#ds1') => dss1
# dom.select('p') => [dss1, dss2, dss3] 모두 선택
.(클래스 이름)으로 선택.ds2를 사용하면 dss2, dss3가 선택<p class="ds1">dss1</p>
<p class="ds2">dss2</p>
<p class="ds2">dss3</p>
<p class="ds5">dss5</p>
<span class="ds5">dss6</span>
# .ds2 => dss2
# .ds1,.ds3 => dss1
# p.ds5 => dss5
# span.ds5 => dss6
:not(선택에서 제거하고 싶은 셀렉터)으로 선택.ds:not(.ds2)으로 셀렉트 하면 class가 ds2인 클래스를 제외 하고 나머지 ds1, ds3, ds4, ds5가 선택<p class="ds ds1">ds1</p>
<p class="ds ds2">ds2</p>
<p class="ds ds3">ds3</p>
<p class="ds ds4">ds4</p>
<p class="ds ds5">ds5</p>
# 둘다 같은 결과값 나옴
# .ds1, .ds3, .ds4, .ds5 => ds2제외
# .ds:not(.ds2) => .ds 클래스 중 ds2제외
.ds:first-child로 설정하면 ds1과 ds3가 선택<body>
<p class="ds" id="ds1">ds1</p>
<p class="sc" id="ds2">ds2</p>
<div class="ds">
<p class="ds ds1">ds3</p>
<p class="ds ds2">ds4</p>
<p class="ds ds3">ds5</p>
<p class="ds ds4">ds6</p>
<p class="ds ds5">ds7</p>
</div>
</body>
div.ds 엘리먼트의 가장 처음 .ds를 선택하고 싶으면 div.ds > .ds:first-child로 셀렉터를 작성.ds:last-child로 div.ds가 선택되어 ds3~ds7이 선택<body>
<p class="ds" id="ds1">ds1</p>
<p class="sc" id="ds2">ds2</p>
<div class="ds">
<p class="ds ds1">ds3</p>
<p class="ds ds2">ds4</p>
<p class="ds ds3">ds5</p>
<p class="ds ds4">ds6</p>
<p class="ds ds5">ds7</p>
</div>
</body>
.ds:nth-child(3), .ds:nth-child(4)로 설정하면 ds4, ds5가 선택nth-child의 ()안의 숫자는 가장 첫번째가 0이 아니라 1로 시작<div class="wrap">
<span class="ds">ds2</span>
<p class="ds ds1">ds3</p>
<p class="ds ds2">ds4</p>
<p class="ds ds3">ds5</p>
<p class="ds ds4">ds6</p>
<p class="ds ds5">ds7</p>
</div>
.contants h1를 선택하면 inner_1, inner_2가 선택<div class="contants">
<h1>inner_1</h1>
<div class="txt">
<h1>inner_2</h1>
</div>
</div>
>문자로 하위 엘리먼트를 셀렉트 했을때, 바로 아래 엘리먼트를 선택.contants > h1를 선택하면 inner_1이 선택<div class="contants">
<h1>inner_1</h1>
<div class="txt">
<h1>inner_2</h1>
</div>
</div>
Tag : divid : #dataclass : .dataattr : [value='no1'].data:not(.data1) : data 클래스 모두에서 data1 클래스 엘리먼트 제외
.data:nth-child(3) : 3번째 하위 엘리먼트에서 .data 클래스를 가진 엘리먼트 선택
공백 : #data .btn : data 아이디 하위의 모든 btn 클래스 엘리먼트를 선택
> : #data .btn : data 아이디 한단계 하위의 btn 클래스 엘리먼트를 선택
.d1, .d2 : d1, d2 클래스 둘다 선택
드디어 금요일이다~~ㅋㅋㅋㅋㅋ 예비군이슈로 수요일에 빠졌는데도 지치는 늙은이다 ˃̣̣̣̣̣̣︿˂
오늘도 어제에 이어서 웹크롤링을 배우는데 진짜 머리가 터질 뻔했다.
무머 어디서 가져고오 뭐하고 뭐하고 하는게 만만치 않다.
그래도 내가 따로 해봤던 내용들(자바스크립트, html)이 나와서 조금은 수월하게 진행했다.
근데 문제는 내가 안다고 자만하는거,,,,, 아마 처음으로 아는게 나와서 그런듯하다ㅋㅋㅋㅋㅋㅋㅋ 더 집중해서 듣자 지원아 ㅋ
주말동안 기자단 활동 준비좀하고 미니프로젝트 복습좀 해봐야겠다. 화이팅~💪😊
아 맞다 오늘 쉬프트 엔터만 누르다가 수업 중에 고정키 떠서 키보드가 안되는 상황이 와서 옴청난 당황을 탔다ㅋㅋㅋㅋㅋㅋㅋㅋ
셀테도 다행히 객관식이라 다하고 체크아웃도 다 완료...ㅎ
다들 고정키 조심하시길~~