ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹 크롤링 데이터를 MySQL에 저장하기
    Project 2023. 7. 3. 12:08
    728x90

     

    Mac에 Mysql 설치

    brew install mysql
    
    brew install mysql-client

    MySQL 실행

    $ mysql.server start

    Mysql 데이터베이스 및 유저 생성

    mysql > CREATE DATABASE crawl_data DEFAULT CHARACTER SET utf8;
    
    mysql > CREATE USER crawl_usr IDENTIFIED BY 'Test001';

    exit 입력 후, Python으로 Mysql 접속 코드 만들기

    import MySQLdb
    
    conn = MySQLdb.connect(
        user="crawl_usr",
        passwd="Test001",
        host="localhost",
        db="crawl_data"
        # charset="utf-8"
    )
    print(type(conn))
    # <class 'MySQLdb.connections.Connection'>
    cursor = conn.cursor()
    print(type(cursor))
    # <class 'MySQLdb.cursors.Cursor'>
    cursor.execute("CREATE TABLE books (title text, url text)")
    conn.commit()

    이 과정에서 MacOS의 경우 MySQLdb가 설치되지 않는 경우가 있다. 이럴 때는 파이썬 스크립트 위에 다음과 같은 명령을 추가 입력한다.

    import pymysql
    pymysql.install_as_MySQLdb()

    다음과 같이 books 테이블이 생성된 것을 알 수 있다.

    books table 내 칼럼들도 잘 지정되어 있음을 알 수 있다.

    그리고 다음과 같이 books table에 하나의 튜플을 집어넣어보자.

    import MySQLdb
    
    conn = MySQLdb.connect(
        user="crawl_usr",
        passwd="Test001",
        host="localhost",
        db="crawl_data"
        # charset="utf-8"
    )
    cursor = conn.cursor()
    bookname = "처음 시작하는 파이썬"
    url_name = "www.wikibook.co.kr"
    cursor.execute(f"INSERT INTO books VALUES(\"{bookname}\",\"{url_name}\")")
    conn.commit()

    select를 이용해 쿼리를 하게 되면, 다음과 같은 결과가 나온다.

    다음 코드는 실행할 때마다 다른 실행결과가 나타나지 않게 하는 것이다.

    import MySQLdb
    
    conn = MySQLdb.connect(
        user="crawl_usr",
        passwd="Test001",
        host="localhost",
        db="crawl_data"
        # charset="utf-8"
    )
    # 커서 생성하기
    cursor = conn.cursor()
    
    # 실행할 때마다 다른값이 나오지 않게 테이블을 제거해두기
    cursor.excute("DROP TABLE IF EXISTS books")
    
    # 테이블 생성하기
    cursor.execute("CREATE TABLE books (title text, url text)")
    
    # 데이터 저장하기
    bookname = "처음 시작하는 파이썬"
    url_name = "www.wikibook.co.kr"
    cursor.execute(f"INSERT INTO books VALUES(\"{bookname}\",\"{url_name}\")")
    # 커밋하기
    conn.commit()
    # 연결종료하기
    conn.close()

    다음은 멜론 차트 100을 크롤링한 후 db에 저장하는 코드다.

    import MySQLdb
    import requests
    from bs4 import BeautifulSoup
    
    if __name__ == "__main__":
        RANK = 100  # 멜론 차트 순위가 1 ~ 100위까지 있음
    
        header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'}
        req = requests.get('https://www.melon.com/chart/week/index.htm',
                           headers=header)  # 주간 차트를 크롤링 할 것임
        html = req.text
        parse = BeautifulSoup(html, 'html.parser')
    
        titles = parse.find_all("div", {"class": "ellipsis rank01"})
        singers = parse.find_all("div", {"class": "ellipsis rank02"})
    
        title = []
        singer = []
    
        for t in titles:
            title.append(t.find('a').text)
    
        for s in singers:
            singer.append(s.find('span', {"class": "checkEllipsis"}).text)
        items = [item for item in zip(title, singer)]
    
    conn = MySQLdb.connect(
        user="crawl_usr",
        passwd="Test001",
        host="localhost",
        db="crawl_data"
        # charset="utf-8"
    )
    # 커서 생성
    cursor = conn.cursor()
    
    # 실행할 때마다 다른값이 나오지 않게 테이블을 제거해두기
    cursor.execute("DROP TABLE IF EXISTS melon")
    
    # 테이블 생성하기
    cursor.execute("CREATE TABLE melon (`rank` int, title text, url text)")
    i = 1
    # 데이터 저장하기
    for item in items:
        cursor.execute(
            f"INSERT INTO melon VALUES({i},\"{item[0]}\",\"{item[1]}\")")
        i += 1
    
    # 커밋하기
    conn.commit()
    # 연결종료하기
    conn.close()

    코드를 실행하게 되면 melon 테이블이 생성된 것을 알 수 있다.

    이런 식으로 멜론 탑 100 차트를 확인할 수 있다.

     

    출처 : https://hyun-am-coding.tistory.com/entry/%ED%81%AC%EB%A1%A4%EB%A7%81%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-DB%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0

    728x90

    'Project' 카테고리의 다른 글

    웹 크롤러 설계  (0) 2023.07.12
    [Parsing] Scrapy를 활용하여 웹 스크래핑 하기  (0) 2023.07.09
    PySpider  (0) 2023.07.08
    Requests 알아보기  (0) 2023.06.28
    Client와 Server, REST API, JSON  (0) 2023.06.26
Designed by Tistory.