네이버북 책 정보 크롤링 - DB 업로드

  1. 개요
  2. 계획
  3. 필요한 라이브러리
  4. DB에 데이터 업로드
  5. DB 업로드 확인
  6. StartNumber 및 book_info 갱신 및 파일 접근
    1. start_number.txt 파일 생성
    2. txt 파일 접근
  7. 마치며

개요


  • 현재 진행하고 있는 도서 대출 서비스 앱에서 도서 정보를 DB에 등록해놔야 하는데, 나는 이 작업을 내가 수작업으로 하기 귀찮았다.
  • 그리하여 파이썬을 이용해 데이터 크롤링으로 도서 정보를 가져오고, 해당 도서를 DB에 추가하려고 제작하였다.
  • 또, 이러한 크롤링, DB에 정보 추가 작업을 내가 수작업으로(직접 파이썬을 실행시키고, 산출물을 DB에 추가하는 작업) 하기 싫어서, Github Action을 이용하여 CI / CD가 되도록 하였다.

계획


  • 네이버북에서 책이름, ISBN, 저자 정보를 제공해주는 것을 확인 했고, URL에서 bid 값만 변경해주면 다른 책 정보를 확인 할 수 있는 것을 검토했다.
  • 그럼 이제 해야할 일은 다음과 같다.
    1. 웹사이트 크롤링
    2. 크롤링한 정보 github에 issue 생성(제대로 크롤링 됐는지 확인하기 위함)
    3. 크롤링한 정보 DB에 추가
    4. startNumber (bid 시작 값) 갱신
  • 나는 이와 같은 작업을 매번 내가 수행하기 귀찮아서 Github Action을 이용하여 자동으로 크롤링하고, 이슈 등록하고, DB에 추가 후, startNumber를 갱신하는 action을 생성하였다.
  • 이전 게시물에선 1, 2 작업을 정리하였고, 이 게시물에서는 위 3, 4 작업을 정리할 계획이다.

필요한 라이브러리


  • 나는 크롤링을 위해, 또, DB 업로드를 위해 다음 라이브러리들을 사용하였다.
    requests==2.27.1
    bs4==0.0.1
    numpy==1.22.3
    PyGithub==1.51
    pymysql==1.0.2
    cryptography==37.0.2    # 저번 포스트엔 없던 새 라이브러리 추가
    

DB에 데이터 업로드

  • DB에 접근하기 위해 파이썬 라이브러리인 pymysql를 사용하였다.

def db_connect(arg_host, arg_user, arg_pass, arg_db, data) :
    # set Value
    con_host = arg_host
    con_user = arg_user
    con_password = arg_pass
    con_db = arg_db

    # connect DB
    print('Connect DB')
    conn = pymysql.connect(host=con_host, user=con_user, password=con_password, db=con_db, charset='utf8')
    cursor = conn.cursor()

    db_insert(cursor, data)
    db_save(conn)

def db_insert(cursor, data) :
    print('insert Data')
    for row in range(len(data[0])):
        # 책 수량 0~10까지 난수 생성하여 넣음
        quantity = np.random.randint(0, 10)

        # insert Data
        # 테이블명 변경 필요
        sql = 'insert into book_status values(%s, %s, %s, %s)'
        vals = (data[0][row], data[1][row], data[2][row], quantity)
        cursor.execute(sql, vals)

def db_save(conn) :
    # save conn 
    print('Save DB')
    conn.commit()

    # Close DB
    print('Close DB')
    conn.close()

DB 업로드 확인


  • 위와 같은 DB 업로드 코드를 구성하였고, 정상적으로 DB에 업로드 되는 것을 확인하였다. - Github에서 소스 보기
  • 나의 경우 GitHub Actions에서 이와 같은 작업을 자동화 하기 때문에 argument로 DB 정보를 입력을 받아 처리하게 된다.

StartNumber 및 book_info 갱신 및 파일 접근


start_number.txt 파일 생성

def editTextFile(contents, text_file_path) :
    with open(text_file_path, 'w', encoding='UTF-8') as f:
        f.write(contents)

editTextFile(str(int(argument[1]) + 100), './start_number.txt')
editTextFile(text_contets, './book_info.txt')
  • 위와 같은 editTextFile 함수를 이용하여 start_number.txt, book_info.txt 파일을 만드는 작업을 하였다.

txt 파일 접근

def readTextFile(text_file_path) :
    book_title = []
    book_isbn = []
    book_writer = []

    contents = [
        book_title,
        book_isbn,
        book_writer
    ]
    temp = ''
    with open(text_file_path, 'r', encoding='UTF-8') as f:
        temp = f.read()

    rows = temp.split('\n')

    for i in range(len(rows)) :
        data = rows[i].split('|')
        book_title.append(data[0])
        book_isbn.append(data[1])
        book_writer.append(data[2])

    return contents
  • 위와 같은 readTextFile 함수를 이용하여 1번에서 작성된 book_info.txt 파일에 접근하여, 데이터를 읽어 DB에 업로드 하였다.

마치며


  • 나는 이와 같은 작업을 통해 파이썬 스크립트를 이용하여 네이버북의 여러 책을 크롤링 하는 작업을 수행했다.
  • 크롤링의 경우 내가 원하는 값을 뽑아내기 위해 정말 여러 시행착오를 겪었다…
    • 갑자기 ‘xa0’이 데이터에 추가 되어있지 않나…
    • 파싱을 잘못해서 값이 지저분하질 않나.. 등등….
    • 추가로 최근에 성인용 책의 경우 로그인을 요구해서 값을 전혀 가지 못하는 경우도 발견하여 이를 해결해줬다.
  • 다음 게시물에서는 가장 험난했던 GitHub Ations를 정리 해보려고 한다.