Python/Do Something

python(requests) - kakao api를 통해 data 받아와서 db에 저장하기 (3)

pybi 2023. 1. 19. 19:48

지난 편에서는 kakao api를 통해서 받아온 값을 출력해 주는 것까지 진행했다.

 

이번에는 받아온 결과값을 mysql db넣고자 한다. mysql db에 값을 넣으려면 pymysql을 사용하면 되는데 해당 방법은 이전 글을 검색하면 확인할 수 있으며, 이번 편에서는 mysql에 넣기 바로 직전 단계 (INSERT xxx) 까지만 진행한다.

 

 

이전편에서 설명했던 코드에서 아래 함수만 추가하면 된다.

def insert_to_db(result_data):
    db_table = 'test_db'  #mysql db table 생성후 이름 넣기
    for idx in range(len(result_data)):
        keys = list(result_data[idx].keys())
        values = list(result_data[idx].values())
        
        keys = ",".join(keys)
        values = ",".join([str(x) for x in values])
        
        query = f"""INSERT IGNORE INTO {db_table} ({keys}) VALUES({values})"""
        print(query)

 

response값은 dictionary 형태로 key는 keys라는 리스트에 담고, value는 values라는 리스트에 담는다. 이후 각 리스트의 변수를 join을 사용해서 ','로 연결시키고 query라는 변수에 집어 넣어주면 끝이다.

 

 

query라는 변수를 print를 통해 출력해보면 아래와 같이 나타나는 것을 알 수 있다. 이는 response의 key값을 db table의 colume값으로 집어 넣는 것과 같다. (지금은 print로 출력했지만 pymysql을 사용한다면 db에 바로 INSERT 되는 것이다.)

What do you want to search?pymin
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(EXPP_ReturnPyObjError PyExc_ValueError &#34;sequence cannot have more than elements&#34; PyObject <b>pyMin</b> pyMax PyObject <b>pyMin</b> pyMax ... ... ... @@ -39,6 +39,15 @@ ... @@ -39,6 +39,15 @@ #include &#34;PIL_time.h...,2022-06-24T07:15:33.000+09:00,source/blender/python/api2_2x/Draw.c,https://gitlab.soundcontact.studio/enpinion/blender/-/commit/3c9a11f24ed9bd131e049e98e86aaee1bcaeb53a?view=parallel&w=1)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(dldmsdb0328 03-20 2 3646 무통장입금확인 sagatious 03-20 2 3645 무통장 입금 확인 부탁드립니다 <b>pymin</b>9388 03-20 2 3644 제발.. 입금확인 부탁
드립니다 nohsihyun 03-20 1 3643 입금확인 juttyq55 03-20 3...,2021-11-13T18:21:21.000+09:00,잠깐! 이곳은 무통장입금을 확인 할 수 있는 곳입니다,https://www.akbonara.co.kr/board/bank?&page=96)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(from pyspark.sql.functions import (concat, count, sum as pysum, array, explode, isnull, avg as pyavg, col, min as <b>pymin</b>, max as pymax),2021-11-07T00:00:00.000+09:00,Anghille,https://gist.github.com/Anghille)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(the same time was considerably lower, and was below the detection limit of our instrumentation (2<b>pYmin</b>). The actual rates of evolution depend upon whether the period in question is discharged- or...,2021-04-11T18:41:35.000+09:00,Journal of IEEE 1995 showing that cycling of the battery does not reduce capacity,https://www.nickel-iron-battery.com/nickel-iron-cycle-testing-1995.pdf)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(87 i1leges drokion valeriad d linao90, theninjaprotigy lebufet, weiiiyang, ceasar1992 dmist, all a memory <b>pymin</b>92 xaeternus jokerg2 rulopolio, mulper1e tabakosek, iblue magiic, mance1973...,2021-01-24T11:29:53.000+09:00,People jazzsim Finder Catalog - piki287,http://g3m.club/gladiator)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(karloz300, adamt2006 lolelena1214, stonegod1123, diosaballerina s alad, perfectiontvx <b>pymin</b>92 moofee tadiam lycaris, kaluchov2 patrational, cc86653817, serjiopsv ultranova9, peter85912 sineptorro...,2021-01-22T23:01:19.000+09:00,antishatter,http://g3m.club/jonjonbr)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(Number of characters on a line 00115 FXint pxmin; // min X coord in content 00116 FXint <b>pymin</b>; // min Y coord in content 00117 FXint pxmax; // max X coord in content 00118 FXint pymax; // max Y...,2020-07-06T18:22:46.000+09:00,FXDCPrint.h,http://fox-toolkit.org/ref12/FXDCPrint_8h-source.html)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(4682 50 claudiaim 010-****-3479 51 venus1886 010-****-0493 52 계란호랑이 010-****-0211 53 <b>pymin</b>217 010-****-2394 54 레이(sts09261) 010-****-4361 55 블루(rna2_82) 010-****-1359 56 반지하의제왕(elise...,2020-06-29T00:00:00.000+09:00,[당첨자 재공지] 찾기 쉬운 생활법령정보 응원 이벤트 당첨자 재공지,https://m.easylaw.go.kr/MOB/NtcInfoRetrieve.laf?ntcSeq=1119)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(PXma k x = min[ Xmax, i Xmax j ] PXmin k = max[ Xmin, i Xmin j ] PYma k x = min[ Ymax, i Ymax j ] <b>PYmin</b> k = max[ Ymin, i Ymin j ] : x : 
x : y : y Fig. 16 Pre-Detection processing 37 17. Fig. 17 Pre...,2020-05-22T16:12:20.000+09:00,초대형 유한요소 해석결과의 효율적 후처리를 위한 후 분류 기반 병렬 가시화 알고리듬의 개발,http://docsplayer.org/149852205-초대형-유한요소-해석결과의-효율적-후처리를-위한-후-분류-기반-병렬-가시화-알고리듬의-개발.html)
INSERT IGNORE INTO test_db (contents,datetime,title,url) VALUES(0, 0) val pxmax = Coord(xmax, 0); val pxmin = Coord(xmin, 0) val pymax = Coord(0, ymax); val <b>pymin</b> = Coord(0, ymin) //axes: val a_path = new geom.GeneralPath a_path.moveTo(pxmin.dx, pxmin.dy); a...,2020-01-23T00:00:00.000+09:00,Constrained random points on a circle,http://www.rosettacode.org/wiki/Constrained_random_points_on_a_circle)       
(pymin_django2) PS C:\pyminv>

 

 

이번 포스팅은 조금 러프하게 글을 썼지만 이전에 다루었던 pymysql 글을 본다면 이해가 갈 것이다. 궁금한 사항이 있으면 댓글로 남겨주세요^^

 

 

아래는 현재까지 진행한 전체 코드이니 참고하면 될 듯 하다.

import requests
import json


def api_req_start():
    query_name = input('What do you want to search?')
    url = 'https://dapi.kakao.com/v2/search/web'
    rest_api_key = {'Authorization': 'KakaoAK {REST API KEY}'}
    data = {
        'query' : query_name,   #string, 검색을 원하는 질의어
        'sort' : 'recency',  #결과 문서 정렬 방식, accuracy(정확도순) 또는 recency(최신순)
        'page' : '1',   #결과 페이지 번호, 1~50 사이의 값, 기본 값 1
        'size' : 10,  #한 페이지에 보여질 문서 수, 1~50 사이의 값, 기본 값 10
    }

    response = requests.get(url, headers=rest_api_key, data=data)
    result = json.loads(response.text)
    insert_to_db(result["documents"])


def insert_to_db(result_data):
    db_table = 'test_db'  #mysql db table 생성후 이름 넣기
    for idx in range(len(result_data)):
        keys = list(result_data[idx].keys())
        values = list(result_data[idx].values())
        
        keys = ",".join(keys)
        values = ",".join([str(x) for x in values])
        
        query = f"""INSERT IGNORE INTO {db_table} ({keys}) VALUES({values})"""
        print(query)
      
       
if __name__ == "__main__":
    api_req_start()