관심쟁이 영호

[#4 이미지 검색 프로젝트] Python - MySQL 연동하기! 본문

Project/SSP - 이미지 검색 및 최저가 검색

[#4 이미지 검색 프로젝트] Python - MySQL 연동하기!

관심쟁이 영호 2021. 9. 19. 20:03
반응형

오늘은 앞서 스크래핑한 내용을 MySQL에 저장하는 작업을 할 것이다.

 

 

 

[#2 Search Shop & Price] 크롤링 2탄 ㅣ Json 형태 크롤링하기 ㅣ Ajax 동적으로 크롤링하기

이전에 포스팅한 [#1 SSP] 크롤링을 해보자! SSP에서 가장 핵심적인 크롤링을 해보자. 목차 툴 라이브러리 설치 User-Agent 쿠팡에서 정보 긁어오기 네이버에서 정보 긁어오기 번개장터에서 정보 긁어

bestkingit.tistory.com

 

 


목차

  • MySQL DB 준비하기
  • Python - MySQL 연동하기
  • 테스트

MySQL DB 준비하기

 

  • MySQL을 설치한다.

- 생략 - 

 

  • MySQL DB를 생성한다.
CREATE DATABASE crawl CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

show databases;

CREATE DATABASE "생성할 DB 이름" CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

- 지정해준 DB이름으로 DB를 생성한다. 문자 세팅은 utf8로 한다!

SHOW DATABASES;

- 생성된 DATABASE를 모두 보여준다.

 

아래와 같이 생성된 것을 볼 수 있다.

 

  • TABLE을 생성하자.
CREATE TABLE model (

    title TEXT NOT NULL, 
    price TEXT, 
    link TEXT, 
    imagePath TEXT, 
    fileName TEXT
    
    );

 

  타입(길이) NULL DEFAULT
title TEXT X -
price TEXT O -
imagePath TEXT O -
fileName TEXT O -
link TEXT O -

 

크롤링 과정에 title, price, imagePath, fileName, link를 받아온다.

내용 중에, 암호화가 되어 있는 부분이 있어서 길이를 예상할 수가 없었다. 그래서 TEXT로 타입을 지정해주었다.

 


Python - MySQL 연동하기

 

1. pymysql을 설치한다.

pip install pymysql

 

2. Python과 연결할 계정을 설정해준다.

conn = pymysql.connect(host= "localhost", user="root", password="1234", db="crawl", charset="utf8")

여기서

"host" 부분을 특정 ip로 할 경우, MySQL DB 서버에 접근할 수 있다. (대형 서비스를 운영하는 실무에서는 이렇게 하겠지!)

 

3. cursor를 설정한다.

 

curs = conn.cursor()

 

커서란?

"데이터베이스 커서(Cursor)는 일련의 데이터에 순차적으로 액세스할 때 검색 및 "현재 위치"를 포함하는 데이터 요소이다." - 위키백과

 

다시 말하자면,

db를 운용할 때, 많은 양의 데이터를 쓰고나 뽑거나 수정하거나 해야 한다.

해당 조작을 하기위해서는 현재 위치에 대한 정보가 필요하다. 현재 위치에 대한 정보를 cursor가 가지게 된다.

 

4. sql을 작성한다.

sql = "insert into model (title, price, link, data_type, fileName, imagePath) VALUES ("+ '\''+str(getModel.getTitle()) + '\''', '+ '\''+ str(getModel.getPrice())+'\'' + ', '+ '\''+str(getModel.getLink()) + '\''+', ' + '\''+ str(getModel.getType()) + '\''+', '+ '\''+str(getModel.getFileName())+'\''+', '+ '\''+str(getModel.filePath)+'\'' + ')'

 

이렇게 하드코딩 처럼 작성하는 것을 싫어한다..

관련 모듈이 있는지 다음에 찾아보자!

 

5. sql을 보내자

curs.execute(sql)

sql이 연결된 db에서 실행된다.

execute를 하게 되면, MySQL에서 트랜잭션이 실행된다. 그리고 보낸 sql이 실행된다.

 

이렇게 하면 완료되는 것이 아니다. 트랜잭션을 종료해야 데이터 변경에 대한 일이 완료가 된다.

 

6. commit 하자

conn.commit()

commit을 하게 되면 insert를 해주었던 내용이 MySQL에 최종 저장이 된다.

 

7. conn을 종료해주자.

 

def close_conn(self):
        conn.close()

 

 

최종 코드

import pymysql
import model
from typing import Type


def get_db():

    return pymysql.connect(host= "localhost", user="root", password="1234", db="crawl", charset="utf8")

def insertData(getModel: Type[model.model]) :

    
    conn = get_db()
    curs = conn.cursor()
    sql = "insert into model (title, price, link, data_type, fileName, imagePath) VALUES ("+ '\''+str(getModel.getTitle()) + '\''', '+ '\''+ str(getModel.getPrice())+'\'' + ', '+ '\''+str(getModel.getLink()) + '\''+', ' + '\''+ str(getModel.getType()) + '\''+', '+ '\''+str(getModel.getFileName())+'\''+', '+ '\''+str(getModel.filePath)+'\'' + ')'
    curs.execute(sql)

    
    conn.commit()
    
    

def close_conn() :
    conn.close()

 

  • "close_conn"을 하나의 함수에서 빼놓은 이유는 반복해서 insert를 할 것이기 때문이다. 매번 close를 하게 되면 그 또한 낭비라고 생각이 된다.
  • get_db라고 함수를 새롭게 정의한 이유는 서버로 요청이 올 때 마다 connection을 새롭게 지정해주어야 하기 때문이다.

 

 

 


테스트

 

크롤링 클래스에서 DB INSERT 클래스 실행을 해보자!

 

올바르게 적용된 것을 알 수 있다!

 

 

 

300x250
Comments