Post

Maria Db 연동(2)

Maria Db 연동(2)

크롤링한 데이터를 저장하기 위해 maria db를 연동해야한다 크롤링한 데이터를 먼저 디비에 저장하고 그뒤 logstash를 통해서 elasticsearch에 저장한다

maria DB 설치

maria db를 우분투에 설치하기 위해서 먼저

1
2
# MariaDB 서버 설치
sudo apt install mariadb-server
1
2
# MariaDB 클라이언트 설치
sudo apt install mariadb-client

초기설정

1
2
# MariaDB secure 설정
sudo mysql_secure_installation

이후 나오는 설정을 읽고 설정을 마무리 한다 (루트계정 비밀번호 설정)

1
sudo mysql -u root -p

이 명령어를 통해서 루트 아이디로 접속이 가능하다

 

크롤링한 데이터를 저장하기 위해서는 데이터베이스 생성과 테이블 생성이 필요하다

1
2
# 데이터 베이스 생성
CREATE DATABASE test_database;
1
2
3
# 원격 접속 가능한 사용자 계정 생성 id test password 1234
# % --> 접속 가능한 호스트설정 모두 허용
CREATE USER 'test'@'%' IDENTIFIED BY '1234';
1
2
3
4
# 사용자에게 데이터베이스 접근 가능한 권한을 부여한다
GRANT ALL PRIVILEGES ON test_database.* TO 'test'@'%';
# 권한 부여를 즉시 적용
FLUSH PRIVILEGES;

 

테스트로 데이터를 저장하기 위한 테이블을 생성하는 명령어

1
2
3
4
5
# id korean_text필드를 가짐 최대 400자의 문자열 저장 테이블 스토리지 엔진 innodb사용
CREATE TABLE example_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    korean_text VARCHAR(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

 

크롤링 데이터 저장 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver.common.by import By
import pymysql

database_N = 'test_database'
table_N = 'example_table'

# MariaDB 연결
db_connection = pymysql.connect(host='localhost', user='test', password='1234', db=database_N, charset='utf8')
cursor = db_connection.cursor()

# Firefox 옵션 설정 (예: headless 모드)
options = FirefoxOptions()
options.add_argument("--headless")  # GUI 없이 실행

# Geckodriver 서비스 설정
service = Service(executable_path="/usr/bin/geckodriver")

# Firefox 웹 드라이버 인스턴스 생성
driver = webdriver.Firefox(service=service, options=options)

# 웹 페이지 열기
driver.get("https://www.naver.com")  

textList = driver.find_elements(By.CLASS_NAME, 'Layout-module__column_left___tLO23')
for t in textList:
    korean_text = t.text  # 변수 이름 변경
    print(korean_text)  
    # 데이터베이스에 데이터 삽입 (컬럼 이름 변경)
    try:
        cursor.execute(f"INSERT INTO {table_N} (korean_text) VALUES (%s)", (korean_text,))
        db_connection.commit()
        print(f"Data inserted successfully: {korean_text}")
    except pymysql.Error as e:
        print(f"Error {e.args[0]}, {e.args[1]}")
        db_connection.rollback()

# 브라우저 닫기
driver.quit()

# 데이터베이스 연결 닫기
db_connection.close()

데이터베이스 조작 명령어

  • 데이터베이스 생성
    1
    
    CREATE DATABASE database_name;
    
  • 데이터베이스 삭제
    1
    
    DROP DATABASE database_name;
    
  • 데이터베이스 선택
    1
    
    USE database_name;
    
  • 데이터베이스 목록 보기
    1
    
    SHOW DATABASES;
    

테이블 조작

  • 테이블 생성

    1
    2
    3
    4
    5
    6
    
    CREATE TABLE table_name (
        column1 datatype,
        column2 datatype,
        column3 datatype,
        ...
    );
    
  • 테이블 구조 보기
    1
    
    DESCRIBE table_name;
    
  • 테이블 삭제
    1
    
    DROP TABLE table_name;
    
  • 테이블 이름 변경
    1
    
    RENAME TABLE old_table_name TO new_table_name;
    
  • 테이블에 열 추가
    1
    
    ALTER TABLE table_name ADD column_name datatype;
    
  • 테이블에서 열 삭제
    1
    
    ALTER TABLE table_name DROP COLUMN column_name;
    

데이터 조작 (CRUD 연산)

  • 데이터 삽입 (Create)
    1
    2
    
    INSERT INTO table_name (column1, column2, column3, ...)
    VALUES (value1, value2, value3, ...);
    
  • 데이터 조회 (Read)
    1
    2
    3
    
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition;
    
  • 데이터 갱신 (Update)
    1
    2
    3
    
    UPDATE table_name
    SET column1 = value1, column2 = value2, ...
    WHERE condition;
    
  • 데이터 삭제 (Delete)
    1
    
    DELETE FROM table_name WHERE condition;
    

기타 유용한 명령어

  • 모든 데이터 조회

    1
    
    SELECT * FROM table_name;
    
  • 정렬하여 데이터 조회
    1
    2
    
    SELECT * FROM table_name
    ORDER BY column_name ASC|DESC;
    
  • 중복 제거하여 데이터 조회
    1
    
    SELECT DISTINCT column_name FROM table_name;
    
  • 조인을 사용한 데이터 조회
    1
    2
    3
    4
    
    SELECT columns
    FROM table1
    INNER JOIN table2
    ON table1.column_name = table2.column_name;
    
  • 그룹화하여 데이터 집계
    1
    2
    3
    
    SELECT column_name, COUNT(*)
    FROM table_name
    GROUP BY column_name;
    
This post is licensed under CC BY 4.0 by the author.