본문 바로가기
python

[python]파이썬 - open API

by skysline 2023. 1. 30.
반응형

Open API 란?

  • API(application programming interface)는 프로그램의 특정한 부분에 요청해서 그 안에 있는 데이터와 서비스(기능)를 이용할 수 있게 해주는 소프트웨어 인터페이스
  • 다양한 데이터를 어디서나 쉽게 이용할 수 있도록 개방된 API
 

주요 Open API 제공처


HTTP(Hyper Text Transfer Protocol) 란?

  • HTML, Plain text, JSON, XML , 이미지 , 동영상 등 다양한 형태의 정보도 전송하는 프로토콜
  • HTTP의 동작 방식

HTTP 통신 방식


HTTP Packet

  • HTTP 통신으로 서버와 클라이언트 사이에 주고 받는 데이터를 말한다.
  • Request Header
    • 클라이언트가 서버에 요청할 때 존재하는 헤더로 요청한 URL, Method, 브라우저 정보 등이 포함되어 있다.
  • Respone Header
    • 서버가 클라이언트의 요청에 대한 응답을 할 때 존재하는 헤더로 콘텐츠에 사용된 인코딩, 응답을 생성하기 위해 서버 시스템에서 사용되는 서버 소프트웨어 및 기타 정보 등이 포함되어 있다.
  • HTTP Body
    • 서버에서 응답시 클라이언트가 요청한 실제 데이터가 포함되어 있다.
    • HTML , image, css , javascript, text ...
 

HTTP 메소드 와 상태코드

  • HTTP 메소드란?
    • 서버에 요청을 보내는 방식
    • GET 방식 : URL 에 데이터를 담아 요청
    • POST 방식 : GET 방식과는 달리 body영역에 데이터를 담아 요청
  • HTTP 상태 코드(응답)
    • 클라이언트가 서버에 요청을 하면, 서버는 요청에 대한 처리 상태를 숫자로 반환하는데 이를 상태 코드라고 한다.
    • 2xx: 요청성공(ex. 200)
    • 3xx: 요청이 유효하지만 주소가 변경(ex. 301)
      • 자동으로 변경된 주소로 이동
    • 4xx: 클라이언트 오류(ex. 404)
    • 5xx: 서버 오류(ex. 500)
    • https://developer.mozilla.org/ko/docs/Web/HTTP/Status

 


 

URL 구조

 
osi7
 

 

reqeusts 라이브러리

  • http 요청을 보내 응답을 받을수 있다.
 
import requests

 
res = requests.get("http://naver.com") # 응답 객체가 반환된다
res.status_code
 
200
res.encoding # 응답 컨텐츠에 대한 인코딩 정보
 
res.text
 
res.request.body # GET방식으로 보내서 BODY 영역에 아무것도 없다.
 
res.request.method # 요청 방식도 확인할수있다.
 
res.request.headers # 요청에 대한 헤더정보
 
{'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
 
res.headers #응답에 대한 헤더정보
 
{'Server': 'NWS', 'Content-Type': 'text/html; charset=UTF-8', 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'P3P': 'CP="CAO DSP CURa ADMa TAIa PSAa OUR LAW STP PHY ONL UNI PUR FIN COM NAV INT DEM STA PRE"', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Strict-Transport-Security': 'max-age=63072000; includeSubdomains', 'Referrer-Policy': 'unsafe-url', 'Content-Encoding': 'gzip', 'Date': 'Thu, 18 Aug 2022 00:49:34 GMT', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive, Transfer-Encoding', 'Vary': 'Accept-Encoding'}

URL 인코딩

  • 퍼센트(%) 인코딩 이라고도 함
  • 영문자와 숫자와 일부 특수문자에 대한 URL에서 사용할수 없는 한글이나 특수문자 들을 인코딩 한다.
 
  • 디코딩 되어있는 서비스키를 사용할 경우
ServiceKey = "gJptcVA42L1/xrflQMnIi5HocBdBgojtF+W2Gq+X0Rp/IUltNk1zrz39E2pVvyzX+s7u2cqprEkcVPWbd4UggQ=="
 
returnType = "xml"
startDate = "2022-01"
endDate = "2022-01"

url = "http://apis.data.go.kr/B553734/iseelectricprod/getElectricProduction"
query = f"?ServiceKey={ServiceKey}&returnType={returnType}&startDate={startDate}&endDate={endDate}"

url+query
 
res = requests.get(url+query)
res.status_code 
 
200
 
res.text
 
  • 인코딩 하기
ServiceKey = "gJptcVA42L1/xrflQMnIi5HocBdBgojtF+W2Gq+X0Rp/IUltNk1zrz39E2pVvyzX+s7u2cqprEkcVPWbd4UggQ=="
ServiceKey = requests.utils.quote(ServiceKey)
ServiceKey
 
 

  • 디코딩하기
requests.utils.unquote(ServiceKey)
 
 
returnType = "xml"
startDate = "2022-01"
endDate = "2022-01"

url = "http://apis.data.go.kr/B553734/iseelectricprod/getElectricProduction"
query = f"?ServiceKey={ServiceKey}&returnType={returnType}&startDate={startDate}&endDate={endDate}"

res = requests.get(url+query)
res.status_code
 
200
res.text
 
 

 

  • xml 을 딕셔너리로 변환해보기
!pip install xmltodict
 
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting xmltodict
  Downloading xmltodict-0.13.0-py2.py3-none-any.whl (10.0 kB)
Installing collected packages: xmltodict
Successfully installed xmltodict-0.13.0
 
import xmltodict
 
dict_data = xmltodict.parse(res.text)
dict_data
 
{'response': {'header': {'resultCode': '00',
   'description': '서울에너지공사 발전소 월별 전기생산량(발전량)',
   'resultMsg': 'NORMAL CODE'},
  'body': {'pageNo': '1',
   'totalCount': '2',
   'items': {'item': [{'unit': 'kWh',
      'elecprodqty': '12911900.00',
      'dates': '2022-01',
      'branchNm': '동부지사',
      'branchCd': '2'},
     {'unit': 'kWh',
      'elecprodqty': '8964872.00',
      'dates': '2022-01',
      'branchNm': '서부지사',
      'branchCd': '1'}]},
   'numOfRows': '10'}}}
 
print(dict_data)
 
{'response': {'header': {'resultCode': '00', 'description': '서울에너지공사 발전소 월별 전기생산량(발전량)', 'resultMsg': 'NORMAL CODE'}, 'body': {'pageNo': '1', 'totalCount': '2', 'items': {'item': [{'unit': 'kWh', 'elecprodqty': '12911900.00', 'dates': '2022-01', 'branchNm': '동부지사', 'branchCd': '2'}, {'unit': 'kWh', 'elecprodqty': '8964872.00', 'dates': '2022-01', 'branchNm': '서부지사', 'branchCd': '1'}]}, 'numOfRows': '10'}}}

import pprint as pp

 
dict_data["response"]["body"]["items"][""]
 
data = res.json() # 딕셔너리 형태로 변환해서 반환한다.
type(data)
 
 

 

네이버 opne api 사용해보기

  • 검색 api
 
 
# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = "kIVAXhyKBVqloyLnT9v7"
client_secret = "wZyet4gzXC"
encText = urllib.parse.quote("빅데이터와 인공지능")
url = "https://openapi.naver.com/v1/search/blog?query=" + encText # json 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # xml 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)
 
{
	"lastBuildDate":"Thu, 18 Aug 2022 14:24:29 +0900",
	"total":253321,
	"start":1,
	"display":10,
	"items":[
		{
			"title":"<b>인공지능<\/b>, <b>빅데이터<\/b>특허 발명 보호를 위한 등록 방법",
			"link":"https:\/\/blog.naver.com\/jninsa?Redirect=Log&logNo=222849778387",
			"description":"저 역시 BM\/<b>인공지능<\/b>\/<b>빅데이터<\/b>\/플랫폼분야 등에서 전문변리사로 활동 중인 만큼, 문의해 주시는 내용을 직접 검토하여 피드백 드리고 있습니다. 출원 전 주의해야 할 부분이 있다면 실무적으로 봤을 때, 일반인이... ",
			"bloggername":"윤 변리사의 실무 이야기",
			"bloggerlink":"https:\/\/blog.naver.com\/jninsa",
			"postdate":"20220816"
		},
		{
			"title":"<b>빅데이터와 인공지능<\/b> : 세상을 바꾸는 기술 이야기",
			"link":"https:\/\/blog.naver.com\/pareko?Redirect=Log&logNo=222609514030",
			"description":"책 소개 이 책은 <b>빅데이터와 인공지능<\/b>을 주제로 생활변화에 대한 인문학 이야기 입니다. &quot;호랑이는... 05 인공지능과의 동거 06 삐딱하게 바라본 기술의 진보 07 현실과 4차 산업의 괴리 08 진정한 4차... ",
			"bloggername":"순돌아범",
			"bloggerlink":"https:\/\/blog.naver.com\/pareko",
			"postdate":"20211231"
		},
		{
			"title":"<b>빅데이터<\/b>, <b>인공지능<\/b>, 플랫폼특허 등록 방법은?",
			"link":"https:\/\/blog.naver.com\/llllllwish?Redirect=Log&logNo=222792337392",
			"description":"오늘은 <b>빅데이터<\/b>, <b>인공지능<\/b>, 플랫폼 특허를 주제로 등록을 어떻게 진행해야 되는지에 대해서 말씀 드리려 합니다. 개인적으로 출원을 준비해서 등록까지 성공시킬 수 있는 확률은 불과 10%도 되지 않습니다.... ",
			"bloggername":"98.3%, 테헤란",
			"bloggerlink":"https:\/\/blog.naver.com\/llllllwish",
			"postdate":"20220628"
		},
		{
			"title":"대구 AI학원 <b>빅데이터<\/b> <b>인공지능<\/b> 결합교육까지",
			"link":"https:\/\/blog.naver.com\/blogmania77?Redirect=Log&logNo=222777436807",
			"description":"바로 이 방대해진 <b>데이터<\/b>들을 제대로 활용할 수 있도록 하는 직업이 오늘 설명드릴 <b>인공지능<\/b>·<b>빅데이터 과<\/b>정입니다. 대구 AI학원 또는 <b>빅데이터<\/b> 학원을 찾으시는 분들이라면 오늘 소개드릴 과정을... ",
			"bloggername":"경북산업직업전문학교",
			"bloggerlink":"https:\/\/blog.naver.com\/blogmania77",
			"postdate":"20220617"
		},
		{
			"title":"[<b>빅데이터<\/b> 트렌드] <b>빅데이터<\/b> <b>인공지능<\/b> 키워드 &quot;빅블러&quot;",
			"link":"https:\/\/blog.naver.com\/theimc?Redirect=Log&logNo=222643714962",
			"description":"빅데이터 키워드 빅블러(Big Blur)와 사례를 소개해드리겠습니다. 사물인터넷(loT), 핀테크, 인공지능(AI)... 또한 코로나19 팬데믹 확산으로 비대면 생활환경이 형성되면서 <b>빅데이터와 인공지능<\/b>은 계속하여... ",
			"bloggername":"The IMC 더아이엠씨 : 마케팅에 빅데이터를 더하다",
			"bloggerlink":"https:\/\/blog.naver.com\/theimc",
			"postdate":"20220210"
		},
		{
			"title":"4차산업혁명시대!, <b>빅데이터와 인공지능<\/b>",
			"link":"https:\/\/blog.naver.com\/canal21?Redirect=Log&logNo=222606867355",
			"description":"마치 내가 검색한 것을 모바일(정확히는 앱일까?)이 알고 보여주는 느낌이 들 정도여서 처음엔 무척 놀랐었는데 <b>빅데이터와 인공지능<\/b>으로 생각해보면 여러 종류의 데이터가 나도 모르는 사이에 모아지고... ",
			"bloggername":"키미스의 사색공간, 꿈과 행복을 찾아서...♡",
			"bloggerlink":"https:\/\/blog.naver.com\/canal21",
			"postdate":"20211228"
		},
		{
			"title":"솔트룩스 <b>인공지능<\/b> AI챗봇, <b>빅데이터<\/b> 기반 SW기업 소개",
			"link":"https:\/\/blog.naver.com\/bk32167?Redirect=Log&logNo=222827482670",
			"description":"솔트룩스는 <b>인공지능<\/b>, <b>데이터<\/b> 사이언스 국내 1위 기업입니다. 이미 많은 클라이언트들과 협업을 하고 있으며, 자연어처리, 시맨틱, 추론을 포함한 <b>인공지능<\/b> 분야의 독보적인 기술을 보유하고 있는 <b>데이터<\/b>... ",
			"bloggername":"자유분방 IT사진",
			"bloggerlink":"https:\/\/blog.naver.com\/bk32167",
			"postdate":"20220728"
		},
		{
			"title":"서강대 <b>빅데이터<\/b> 대학원 <b>데이터<\/b>사이언스 <b>인공지능<\/b>(ai) 학과... ",
			"link":"https:\/\/blog.naver.com\/roseandme7753?Redirect=Log&logNo=222845224035",
			"description":"<b>인공지능<\/b>, <b>빅데이터<\/b> 분석, 프로그래밍의 질문들이며 매년 면접 질문은 비슷해 준비하기 어렵진 않습니다. 서강대 <b>데이터<\/b> 분석 대학원 외 대표적인 대학원 알아보기 ※ 서강대 외 대표적인 <b>데이터<\/b>... ",
			"bloggername":"인테리어",
			"bloggerlink":"https:\/\/blog.naver.com\/roseandme7753",
			"postdate":"20220810"
		},
		{
			"title":"[<b>빅데이터<\/b>, <b>인공지능<\/b> 기술역량기반 디지털 전략 전문가... ",
			"link":"https:\/\/blog.naver.com\/leelee3s?Redirect=Log&logNo=222844931565",
			"description":"오늘 소개해드릴 교육내용은 <b>빅데이터와 인공지능<\/b>을 교육하는 과정인데요. 빅데이터 산업 활성화를... 국비전액지원 훈련과정명 빅데이터, 인공지능 기술역량기반 디지털 전략 전문가 양성과정 훈련기간 2022.... ",
			"bloggername":"오! 해삐",
			"bloggerlink":"https:\/\/blog.naver.com\/leelee3s",
			"postdate":"20220810"
		},
		{
			"title":"&lt;인사이트 플랫폼&gt; 디지털 플랫폼, <b>빅데이터와 인공지능<\/b>의 모든 것",
			"link":"https:\/\/blog.naver.com\/indiecat?Redirect=Log&logNo=222120978879",
			"description":"빅데이터 매뉴얼 &lt;인사이트 플랫폼&gt;. <b>빅데이터와 인공지능<\/b>이 가져올 사회의 변화에 대한 이야기는... 빅데이터, 인공지능, 네트워크 기술이 융합된 디지털 플랫폼에 대한 이해를 돕는 &lt;인사이트 플랫폼&gt;으로... ",
			"bloggername":"인디캣책곳간",
			"bloggerlink":"https:\/\/blog.naver.com\/indiecat",
			"postdate":"20201020"
		}
	]
}
 

 


  • 네이버 검색 api를 이용하여 영화 정보 받아오기
client_id ="kIVAXhyKBVqloyLnT9v7"
client_secret = "wZyet4gzXC"
 
headers ={
    "X-Naver-Client-Id" : client_id,
    "X-Naver-Client-Secret" : client_secret

}
url = "https://openapi.naver.com/v1/search/movie.json" # 요청 URL만
params ={
    "query":"완벽한 타인"
}
 
res = requests.get(url,params=params,headers=headers)
if res.status_code == 200:
    data = res.json()
else:
    print(f'Error Code:{res.status_code}')
 
print(data)
 
{'lastBuildDate': 'Thu, 18 Aug 2022 11:52:31 +0900', 'total': 5, 'start': 1, 'display': 5, 'items': [{'title': '<b>완벽한 타인</b>과의 섹스경험담', 'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=207848', 'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/2078/207848_P01_115152.jpg', 'subtitle': '', 'pubDate': '2021', 'director': '이로운|', 'actor': '', 'userRating': '0.00'}, {'title': '<b>완벽한 타인</b>: 블러디 문', 'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=212261', 'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/2122/212261_P01_170238.jpg', 'subtitle': 'Bloody Moon Fest', 'pubDate': '2020', 'director': '쿠앙 둥 뉴엔|', 'actor': '호 타이 화|안 홍|흐어 비 반|', 'userRating': '0.00'}, {'title': '<b>완벽한 타인</b> : 비밀의 스와핑', 'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=188710', 'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/1887/188710_P01_135128.jpg', 'subtitle': '', 'pubDate': '2019', 'director': '이지은|', 'actor': '', 'userRating': '0.00'}, {'title': '<b>완벽한 타인</b>', 'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=167638', 'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/1676/167638_P71_133542.jpg', 'subtitle': 'Intimate Strangers', 'pubDate': '2018', 'director': '이재규|', 'actor': '유해진|조진웅|이서진|염정아|김지수|송하윤|윤경호|', 'userRating': '8.61'}, {'title': '<b>완벽한 타인</b>: 킬 모바일', 'link': 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=184973', 'image': 'https://ssl.pstatic.net/imgmovie/mdi/mit110/1849/184973_P01_154931.jpg', 'subtitle': 'Kill Mobile', 'pubDate': '2017', 'director': '우묘|', 'actor': '통따웨이|마려|곽사연|교삼|톈위|대악악|해몽요|', 'userRating': '5.33'}]}

import pprint as pp
pp.pprint(data)
 
{'display': 3,
 'items': [{'bloggerlink': 'https://blog.naver.com/jninsa',
            'bloggername': '윤 변리사의 실무 이야기',
            'description': '저 역시 BM/<b>인공지능</b>/<b>빅데이터</b>/플랫폼분야 등에서 전문변리사로 '
                           '활동 중인 만큼, 문의해 주시는 내용을 직접 검토하여 피드백 드리고 있습니다. 출원 전 '
                           '주의해야 할 부분이 있다면 실무적으로 봤을 때, 일반인이... ',
            'link': 'https://blog.naver.com/jninsa?Redirect=Log&logNo=222849778387',
            'postdate': '20220816',
            'title': '<b>인공지능, 빅데이터</b>특허 발명 보호를 위한 등록 방법'},
           {'bloggerlink': 'https://blog.naver.com/llllllwish',
            'bloggername': '98.3%, 테헤란',
            'description': '오늘은 <b>빅데이터</b>, <b>인공지능,</b> 플랫폼 특허를 주제로 등록을 어떻게 '
                           '진행해야 되는지에 대해서 말씀 드리려 합니다. 개인적으로 출원을 준비해서 등록까지 성공시킬 '
                           '수 있는 확률은 불과 10%도 되지 않습니다.... ',
            'link': 'https://blog.naver.com/llllllwish?Redirect=Log&logNo=222792337392',
            'postdate': '20220628',
            'title': '<b>빅데이터</b>, <b>인공지능,</b> 플랫폼특허 등록 방법은?'},
           {'bloggerlink': 'https://blog.naver.com/bk32167',
            'bloggername': '자유분방 IT사진',
            'description': '솔트룩스는 <b>인공지능,</b> <b>데이터</b> 사이언스 국내 1위 기업입니다. 이미 '
                           '많은 클라이언트들과 협업을 하고 있으며, 자연어처리, 시맨틱, 추론을 포함한 '
                           '<b>인공지능</b> 분야의 독보적인 기술을 보유하고 있는 <b>데이터</b>... ',
            'link': 'https://blog.naver.com/bk32167?Redirect=Log&logNo=222827482670',
            'postdate': '20220728',
            'title': '솔트룩스 <b>인공지능</b> AI챗봇, <b>빅데이터</b> 기반 SW기업 소개'}],
 'lastBuildDate': 'Thu, 18 Aug 2022 14:24:46 +0900',
 'start': 1,
 'total': 536024}

data["items"]
 
 
  • 데이터 프레임으로 변환해보기
 
import pandas as pd
pd.DataFrame(data["items"])
 
 
 
client_id ="kIVAXhyKBVqloyLnT9v7"
client_secret = "wZyet4gzXC"
 
headers ={
    "X-Naver-Client-Id":client_id,
    "X-Naver-Client-Secret":client_secret
}

 
def sm(*args):
    headers ={
    "X-Naver-Client-Id":client_id,
    "X-Naver-Client-Secret":client_secret
}   
    url ="https://openapi.naver.com/v1/search/local.json"
    params ={
        "query":"서울 맛집",
        "display": 3

        }
    res = requests.get(url,params=params,headers=headers)
    data = res.json()
    if res.status_code == 200:
        print(data)
        
    else:
        res.status_code != 200
        print(data)
        result = 'None'
    return data

 
 
 
{'lastBuildDate': 'Thu, 18 Aug 2022 14:25:00 +0900', 'total': 3, 'start': 1, 'display': 3, 'items': [{'title': '영일분식', 'link': '', 'category': '분식>종합분식', 'description': '', 'telephone': '', 'address': '서울특별시 영등포구 문래동4가 8-26', 'roadAddress': '서울특별시 영등포구 도림로141가길 34-1', 'mapx': '302044', 'mapy': '546595'}, {'title': '니커버커베이글', 'link': 'https://www.instagram.com/knickerbockerbagel_official/', 'category': '카페,디저트>베이커리', 'description': '', 'telephone': '', 'address': '서울특별시 송파구 송파동 32-1 1층 109~112호', 'roadAddress': '서울특별시 송파구 석촌호수로 268 1층 109~112호', 'mapx': '321134', 'mapy': '545678'}, {'title': '명동교자 본점', 'link': 'http://www.mdkj.co.kr/', 'category': '한식>칼국수,만두', 'description': '', 'telephone': '', 'address': '서울특별시 중구 명동2가 25-2', 'roadAddress': '서울특별시 중구 명동10길 29', 'mapx': '310579', 'mapy': '551631'}]}
{'lastBuildDate': 'Thu, 18 Aug 2022 14:25:00 +0900',
 'total': 3,
 'start': 1,
 'display': 3,
 'items': [{'title': '영일분식',
   'link': '',
   'category': '분식>종합분식',
   'description': '',
   'telephone': '',
   'address': '서울특별시 영등포구 문래동4가 8-26',
   'roadAddress': '서울특별시 영등포구 도림로141가길 34-1',
   'mapx': '302044',
   'mapy': '546595'},
  {'title': '니커버커베이글',
   'link': 'https://www.instagram.com/knickerbockerbagel_official/',
   'category': '카페,디저트>베이커리',
   'description': '',
   'telephone': '',
   'address': '서울특별시 송파구 송파동 32-1 1층 109~112호',
   'roadAddress': '서울특별시 송파구 석촌호수로 268 1층 109~112호',
   'mapx': '321134',
   'mapy': '545678'},
  {'title': '명동교자 본점',
   'link': 'http://www.mdkj.co.kr/',
   'category': '한식>칼국수,만두',
   'description': '',
   'telephone': '',
   'address': '서울특별시 중구 명동2가 25-2',
   'roadAddress': '서울특별시 중구 명동10길 29',
   'mapx': '310579',
   'mapy': '551631'}]}
 
pd.DataFrame(data["items"])
 
 
headers ={
    "X-Naver-Client-Id":client_id,
    "X-Naver-Client-Secret":client_secret
}
url ="https://openapi.naver.com/v1/search/blog.json"
params = {
    "query":"대흉근"
}
res = requests.get(url,headers=headers,params=params)
if  res.status_code == 200:
    data = res.json()
else:
    print("none")
 
import pprint as pp
pp.pprint(data)
 
 
import pandas as pd
pd.DataFrame(data["items"])
 
 
def naver(*args):
    headers = {
        "X-Naver-Client-Id": client_id,
        "X-Naver-Client-Secret": client_id
}
    url ="https://openapi.naver.com/v1/search/cafearticle.json"
    params = {
        "query": "개발자",
        "display" : 2
}
    res = requests.get(url,headers=headers,params=params)
    data = res.json()
    if res.status_code == 200:
        print(data)
    else:
        print("없음")
    return data
 
pd.DataFrame(data["items"])
 
 

 


파파고 번역 해보기

url ="https://openapi.naver.com/v1/papago/n2mt"

headers ={
    "X-Naver-Client-Id":client_id,
    "X-Naver-Client-Secret":client_secret
}
data ={
    "source":"ko", # 원본언어 코드
    "target":"en", # 목적언어 코드
    "text":   "파이썬은 재밌다."  # 번역할 텍스트
}
res = requests.post(url,headers=headers,data=data)
result = res.json()
pp.pprint(result)
 
{'message': {'@service': 'naverservice.nmt.proxy',
             '@type': 'response',
             '@version': '1.0.0',
             'result': {'dict': None,
                        'engineType': 'N2MT',
                        'pivot': None,
                        'srcLangType': 'ko',
                        'tarDict': None,
                        'tarLangType': 'en',
                        'translatedText': 'Python is fun.'}}}
 
result["message"]["result"]["translatedText"]
 
 
def translate(text,url,client_id,client_secret,source="ko",target="en"):


    headers ={
        "X-Naver-Client-Id":client_id,
        "X-Naver-Client-Secret":client_secret
    }
    data ={
        "source": source, # 원본언어 코드
        "target": target, # 목적언어 코드
        "text":   text  # 번역할 텍스트
    }
    res = requests.post(url,headers=headers,data=data)
    result = res.json()
    if res.status_code ==200:
        result = result["message"]["result"]["translatedText"]
    return result

 
url ="https://openapi.naver.com/v1/papago/n2mt"  
text = "이누야샤."
translate(text,url,client_id,client_secret,target="ja")
 
!pip install git+https://github.com/kmu-agent/api_project.git
 
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting git+https://github.com/kmu-agent/api_project.git
  Cloning https://github.com/kmu-agent/api_project.git to /tmp/pip-req-build-6p98hml1
  Running command git clone -q https://github.com/kmu-agent/api_project.git /tmp/pip-req-build-6p98hml1
Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from myapi==0.0.1) (2.23.0)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->myapi==0.0.1) (1.24.3)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->myapi==0.0.1) (2.10)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->myapi==0.0.1) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->myapi==0.0.1) (2022.6.15)
Building wheels for collected packages: myapi
  Building wheel for myapi (setup.py) ... done
  Created wheel for myapi: filename=myapi-0.0.1-py3-none-any.whl size=1755 sha256=432177cccfc4502a219c2e5f8ea6f9d864ec8436acbdfd22586d0b6a63ba12a3
  Stored in directory: /tmp/pip-ephem-wheel-cache-l1jyt6mj/wheels/31/51/b7/cc95a06356dbc825713521cea5044b80fcc2ce882f287a116b
Successfully built myapi
Installing collected packages: myapi
Successfully installed myapi-0.0.1
 
from my_api import naver_api
 
from google.colab import drive
drive.mount('/content/drive')
 
Mounted at /content/drive
 
import yaml
KEY_FILE = "/content/drive/MyDrive/data/local.yml"
with open(KEY_FILE,"r",) as f:
    naver_keys = yaml.load(f)
naver_keys
 
{'CRIENT_id': 'kIVAXhyKBVqloyLnT9v7', 'CLIENT_SECERET': 'wZyet4gzXC'}
 
import pprint as pp
 
 
def search_api(url,client_id,client_secret,params):
    headers = {
        "X-Naver-Client-Id" : client_id,
        "X-Naver-Client-Secret" : client_secret
    }
    
    res = requests.get(url,params=params,headers=headers)
    result = res.json()
    if res.status_code != 200:
        print(result)
        result = None
    return result   
 
 
if __name__ == "__main__":
    
   
    
    CRIENT_id = naver_keys["CRIENT_id"]
    CLIENT_SECERET = naver_keys["CLIENT_SECERET"]

    url = "https://openapi.naver.com/v1/search/image"
    params = {
        "query":"아이유"
    }
    result = naver_api.search_api(url,CRIENT_id,CLIENT_SECERET,params)

 
 
pp.pprint(result)
 
{'display': 10,
 'items': [{'link': 'https://i.pinimg.com/736x/da/d5/f3/dad5f3b5dcd1b61abfa8497d5fd7112d.jpg',
            'sizeheight': '736',
            'sizewidth': '736',
            'thumbnail': 'https://search.pstatic.net/sunny/?src=https://i.pinimg.com/736x/da/d5/f3/dad5f3b5dcd1b61abfa8497d5fd7112d.jpg&type=b150',
            'title': 'Pin page Pin by Yuki Ek on IU아이유 in 2022'},
           {'link': 'http://imgnews.naver.net/image/469/2022/06/08/0000679403_001_20220608182004399.jpg',
            'sizeheight': '576',
            'sizewidth': '640',
            'thumbnail': 'https://search.pstatic.net/common/?src=http://imgnews.naver.net/image/469/2022/06/08/0000679403_001_20220608182004399.jpg&type=b150',
            'title': '&apos;브로커&apos; 아이유 "언니 출산 이야기, 미혼모 연기에 참고" (인터뷰)'},
           {'link': 'https://i.pinimg.com/736x/b4/b4/d6/b4b4d6ca2767aa0b4c7c252afb435455.jpg',
            'sizeheight': '981',
            'sizewidth': '736',
            'thumbnail': 'https://search.pstatic.net/sunny/?src=https://i.pinimg.com/736x/b4/b4/d6/b4b4d6ca2767aa0b4c7c252afb435455.jpg&type=b150',
            'title': 'Pin by Finey Lee on IU (아이유) in 2022 | Girl, J.i., '
                     'Cannes'},
           {'link': 'http://imgnews.naver.net/image/5129/2022/08/06/1659745067_1648954_20220806092201469.jpg',
            'sizeheight': '905',
            'sizewidth': '658',
            'thumbnail': 'https://search.pstatic.net/common/?src=http://imgnews.naver.net/image/5129/2022/08/06/1659745067_1648954_20220806092201469.jpg&type=b150',
            'title': '아이유 측 “콘서트 부정 티켓, 팬클럽 영구제명” [공식입장]'},
           {'link': 'https://img.theqoo.net/img/pKiij.gif',
            'sizeheight': '370',
            'sizewidth': '500',
            'thumbnail': 'https://search.pstatic.net/sunny/?src=https://img.theqoo.net/img/pKiij.gif&type=b150',
            'title': '프로듀사에서 신디 존예라고 왜 아무도 말 안해줬어.gif - 드영배 카테고리'},
           {'link': 'https://img.theqoo.net/img/lZLCq.jpg',
            'sizeheight': '642',
            'sizewidth': '1200',
            'thumbnail': 'https://search.pstatic.net/sunny/?src=https://img.theqoo.net/img/lZLCq.jpg&type=b150',
            'title': '헤메코 개열일 하는 첫주차 호텔 델루나 아이유 의상 모음 - 스퀘어 카테고리'},
           {'link': 'https://i.pinimg.com/736x/d0/93/be/d093be8378fc85b5fe0a8b3d281e9b8d.jpg',
            'sizeheight': '728',
            'sizewidth': '735',
            'thumbnail': 'https://search.pstatic.net/sunny/?src=https://i.pinimg.com/736x/d0/93/be/d093be8378fc85b5fe0a8b3d281e9b8d.jpg&type=b150',
            'title': 'Pin by Yuki Ek on IU아이유 | Iu hair, Korean actresses, '
                     'Girl model'},
           {'link': 'https://i.pinimg.com/736x/56/56/76/5656765b611b3a49430e3c427e3df7b5.jpg',
            'sizeheight': '736',
            'sizewidth': '736',
            'thumbnail': 'https://search.pstatic.net/sunny/?src=https://i.pinimg.com/736x/56/56/76/5656765b611b3a49430e3c427e3df7b5.jpg&type=b150',
            'title': 'IU Pin by 𝙴𝚖𝚖ã <3  ⁷⟬⟭💜 on IU{아이유} | Alone girl, Bts '
                     'korea, Korea'},
           {'link': 'https://fimg5.pann.com/new/download.jsp?FileID=64440855',
            'sizeheight': '783',
            'sizewidth': '738',
            'thumbnail': 'https://search.pstatic.net/sunny/?src=https://fimg5.pann.com/new/download.jsp?FileID=64440855&type=b150',
            'title': '아이유도 수해 1억 기부함 : 네이트판 아이유도 수해 1억 기부함'},
           {'link': 'https://i.pinimg.com/originals/f7/00/37/f70037f4993e190cfbecdc587274dac9.jpg',
            'sizeheight': '990',
            'sizewidth': '990',
            'thumbnail': 'https://search.pstatic.net/sunny/?src=https://i.pinimg.com/originals/f7/00/37/f70037f4993e190cfbecdc587274dac9.jpg&type=b150',
            'title': '아이유★IU 아이유★IU in 2022 | Crown jewelry, Crown, Fashion'}],
 'lastBuildDate': 'Fri, 19 Aug 2022 15:44:21 +0900',
 'start': 1,
 'total': 653575}

rss

!pip install feedparser
 
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting feedparser
  Downloading feedparser-6.0.10-py3-none-any.whl (81 kB)
     |████████████████████████████████| 81 kB 3.5 MB/s 
Collecting sgmllib3k
  Downloading sgmllib3k-1.0.0.tar.gz (5.8 kB)
Building wheels for collected packages: sgmllib3k
  Building wheel for sgmllib3k (setup.py) ... done
  Created wheel for sgmllib3k: filename=sgmllib3k-1.0.0-py3-none-any.whl size=6066 sha256=54fb9a5a945c92692fe80548c4db233cb6ef1a0d4ee3bbd046fdce160432133f
  Stored in directory: /root/.cache/pip/wheels/83/63/2f/117884c3b19d46b64d3d61690333aa80c88dc14050e269c546
Successfully built sgmllib3k
Installing collected packages: sgmllib3k, feedparser
Successfully installed feedparser-6.0.10 sgmllib3k-1.0.0
 
!pip install goose3
 
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting goose3
  Downloading goose3-3.1.12-py3-none-any.whl (88 kB)
     |████████████████████████████████| 88 kB 3.3 MB/s 
Requirement already satisfied: lxml in /usr/local/lib/python3.8/dist-packages (from goose3) (4.9.2)
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.8/dist-packages (from goose3) (4.6.3)
Requirement already satisfied: Pillow in /usr/local/lib/python3.8/dist-packages (from goose3) (7.1.2)
Requirement already satisfied: requests in /usr/local/lib/python3.8/dist-packages (from goose3) (2.23.0)
Requirement already satisfied: python-dateutil in /usr/local/lib/python3.8/dist-packages (from goose3) (2.8.2)
Collecting pyahocorasick
  Downloading pyahocorasick-1.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (110 kB)
     |████████████████████████████████| 110 kB 9.1 MB/s 
Collecting langdetect
  Downloading langdetect-1.0.9.tar.gz (981 kB)
     |████████████████████████████████| 981 kB 68.2 MB/s 
Collecting cssselect
  Downloading cssselect-1.2.0-py2.py3-none-any.whl (18 kB)
Requirement already satisfied: six in /usr/local/lib/python3.8/dist-packages (from langdetect->goose3) (1.15.0)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.8/dist-packages (from requests->goose3) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.8/dist-packages (from requests->goose3) (2022.12.7)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.8/dist-packages (from requests->goose3) (2.10)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.8/dist-packages (from requests->goose3) (1.24.3)
Building wheels for collected packages: langdetect
  Building wheel for langdetect (setup.py) ... done
  Created wheel for langdetect: filename=langdetect-1.0.9-py3-none-any.whl size=993242 sha256=433a7ce70b52d043b39b1d7301f0eeb19f565f3795b15c3dcf132c9491baf478
  Stored in directory: /root/.cache/pip/wheels/13/c7/b0/79f66658626032e78fc1a83103690ef6797d551cb22e56e734
Successfully built langdetect
Installing collected packages: pyahocorasick, langdetect, cssselect, goose3
Successfully installed cssselect-1.2.0 goose3-3.1.12 langdetect-1.0.9 pyahocorasick-1.4.4
 
import pandas as pd
import feedparser
import requests
from goose3 import Goose
from goose3.text import StopWordsKorean
 
 
url = 'https://news.google.com/rss/search?q=%EB%B0%98%EB%A0%A4%EB%8F%99%EB%AC%BC&hl=ko&gl=KR&ceid=KR%3Ako'
 
def get_data(url):
    try:
        res = requests.get(url)
        html = res.text
        data = feedparser.parse(html)
        print(data.feed.title)
        return data
    except:
        return None
parsed_data = get_data(url)
type(parsed_data)
"반려동물" - Google 뉴스
feedparser.util.FeedParserDict
 
len(parsed_data['entries']) # 기사 갯수
100
 
  • 기사 정보확인
num_entries =2
article = parsed_data['entries'][num_entries]
type(article)
feedparser.util.FeedParserDict
반응형

'python' 카테고리의 다른 글

[pypthon]파이썬 - pandas 를 이용한 eda  (0) 2023.02.02
[python]파이썬 - pandas  (0) 2023.01.31
[python]파이썬 - pip와 가상환경  (0) 2023.01.26
[python]파이썬 - 파일 입출력  (0) 2023.01.26
[python]파이썬 - 정규표현식  (0) 2023.01.26

댓글