본문 바로가기
Data/Crawling

[2021.07.05] 인턴 +126 How to add data to AWS DB (in Python)?

by injekim97 2021. 7. 5.
반응형

[2021.07.05]  인턴 +126  How to add data to AWS DB (in Python)?

 

 

파이썬을 이용하여, AWS DB에 데이터를 넣는 방법에 대해 알아보도록 하자.

우선,  AWS DB에 연동하기 위해 EC2-인스턴스를 만든 후, 가상머신에 접속하여, Mysql을 설치 해줘야 한다.

-> 개인정보를 위해, 퍼블릭 IPv4 DNS 값을 넣어주면 된다. (해당 계정은 IAM이 아닌 ROOT 계정임)

 

 

 

 

+@ VS CODE에서 mysql 사용하는 방법

- 해당 사진에서 VS CODE에서 mysql 설치하는 방법은 생략함(awstoolkit 설치하듯이, mysql 검색하여 설치하면 됨)

-> 설치를 했다면, 해당 페이지 처럼 Connect가 뜨는데, Host,Username,Port,Password,Databasenam 적어주면 됨

 

 

 

+@ VS CODE에서 mysql 사용법(데이터 삭제 & Commit)

-> 해당 모습은 AWS DB에 크롤링한 데이터가 들어간 것

-> 여기서 해당 table 값을 지울려면, 빨간색 동그라미에 친 것에 명령어를  쳐주면 됨

delete from 테이블명;

commit

ALTER TABLE Inquiry AUTO_INCREMENT = 1;   # auto increment reset 방법 ★

그런 다음에 데이터를 넣고, 재생버튼을 클릭하면 위에 같이 데이터가 들어가짐.

 

 

 

-------------------------------------------------------------------------------------------------------------------------------

<python 에서 mysql을 사용하기 위한 모듈>

import pymysql

 

 

<Python 에서 AWS DB 연동 및 설정 방법>

# AWS DB 연동
def get_db():
    db = pymysql.connect(

        host='EC2 인스턴스 - 퍼블릭 IPv4 DNS',
        port=3306,
        user='db_user',
        passwd='db_passwd', 
        db='db_database_name',
        charset='utf8'
    )

    return db

 

 

# AWS DB에 데이터 넣기 
def insert_inquiry(data):
    db = get_db()
    mycursor = db.cursor()


    try:
        sql = "INSERT INTO Inquiry (OrgIndex,Segment,Title,content,regDate,Tag) VALUES (%s, %s, %s, %s, %s, %s)"
        val = (data[0],delete_mystr(str(data[1])),str(data[2]),str(data[3]),str(data[4]),delete_mystr(str(data[5])))
        mycursor.execute(sql, val)
        
        db.commit()
        db.close()
        
    except Exception as e:
        print('db insert inquiry error', e)
        db.close()

 

 

---------------------------------------------------------------------------------------------------------------------------------

law-talk 크롤링 하면서, 꿀팁들

 

1. Tag 공백일 때, 데이터 공백 넣는 방법을 몰라서 3시간 정도 걸렸다. (해결 방법)

Tag = "";
    # ★★★★★ Tag 가 비어있을 때, 인식을 못함, if문으로 ★★★★★

    try :
        Tag = driver.find_element_by_xpath("//*[@id='root-view']/div/div/div/question/div/div[1]/recommend-keyword/div").text
        Tag = Tag.split("\n")
        del Tag[0] # 관련 키워드 삭제   

    except Exception as e :
        print("관련 키워드가 비어 있어서 except 처리")
        print(e)
        print("\n")
        Tag = "" # ★★★★★ 여기서 Tag를 꼭 reset해줘야 해당 Tag들이 제대로 저장 됨 ★★★★★
        pass

 

2. 웹 페이지에 scroll down(스크롤 다운 & 스크롤 내리기) 구현, 모든 곳에서 사용 가능

# for 문에 의해 scroll down 2번
def scroll_dowmn_page2():
    for i in range(2): # adjust integer value for need
        driver.execute_script("window.scrollBy(0, 200)")
        time.sleep(0.5)

 

 

3. 2중 for문으로 코드 가독성 ↑

-> 바깥 for문 1번, 아래 for문 다 돈 후에, 다시 바깥 for문으로 돌아감

 # 다음 페이지로 이동 
            for i in range(2,10):
                keyword = '사기'
                url = f'https://www.lawtalk.co.kr/cases?pg={i}&sort=recentAnswer&keyword={keyword}'
                driver.get(url)
                
                # 한 페이지에 있는 게시글 10개 데이터들을 추출
                for i in range(1,11):
                    time.sleep(4)
                    case_board = driver.find_element_by_xpath(f"//*[@id='root-view']/div[2]/div[3]/section/div/div[4]/div/section/case-card[{i}]/a/div")
                    case_board.click()

                    
                    inquirty_data() # law-talk-inquiry data extract & db data commit &  close
                    driver.back() # 뒤로가기
                    time.sleep(3)

 

 

4. replace로 불필요한 [,],값 삭제

# "[","]" delete function 
def delete_mystr(str):
    str = str.replace("[","")
    str = str.replace("]","")
    return str

 

 

 

5. AWS DB 연동 및 AWS DB에 데이터 삽입

-> 중요한 것은, 크롤링 하다가 해당 컬럼에 값이 빌 때가 있는데, 그럴 땐  공백으로 꼭 채워줘야 함

안 채워주면, list index out of range 에러라는 문구 발생

# AWS DB 연동
def get_db():
    db = pymysql.connect(
        host='ec2-13-125-144-25.ap-northeast-2.compute.amazonaws.com',
        port=3306,
        user='admin',
        passwd='1/zw;GytAwx*', 
        db='laws',
        charset='utf8'
    )
    return db


# AWS DB에 데이터 넣기 
def insert_inquiry(data):
    db = get_db()
    mycursor = db.cursor()

    try:
        sql = "INSERT INTO Inquiry (OrgIndex,Segment,Title,content,regDate,Tag) VALUES (%s, %s, %s, %s, %s, %s)"
        val = (data[0],delete_mystr(str(data[1])),str(data[2]),str(data[3]),str(data[4]),delete_mystr(str(data[5])))
        mycursor.execute(sql, val)
        
        db.commit()
        db.close()
    
    
    # ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    # regdate (게시글 작성 시간)을 기준하여, 데이터를 추출한다.
    # 1~59분전 , 0~23시간 전, 일 때 해당 소스코드는 데이터를 추출함
    # 추출하지 못할 경우엔, 인덱스가 맞지않아,  list index out of range 에러 발생
    except Exception as e:
        print("1일 이후(게시글 작성 시간)의 시간들은 저장하지 않기 때문에,regdate 인덱스가 NULL")
        print("그러므로,  list index out of range 에러 발생")
        print('db insert inquiry error', e)
        print("\n")
        db.close()

 

반응형

댓글