파이썬 데이터베이스 저장할때 다른방법없을까요?

조회수 393회
import requests
from bs4 import BeautifulSoup
import pymysql

conn = pymysql.connect(host='localhost', user='root', password='db비밀번호',             charset='utf8', db='pythondb') 
cur = conn.cursor()

for page in range(1, 5):
    url = "https://www.10000recipe.com/recipe/list.html?  order=reco&page="+str(page)
    print(url)
    response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')
lis = soup.select('#contents_area_full > ul > ul > li')

for li in lis:  
    food = li.select_one('div.common_sp_caption > div.common_sp_caption_tit.line2')
    if food is not None:
        title = food.text
        sql = 'INSERT INTO test (Name) VALUES (%s)'
        cur.execute(sql, (title))

for i in range(2, 17):
    trees = soup.select_one(f'div:nth-child(1) > a:nth-child({i})').get_text()
    cur.execute('INSERT INTO test (Category) VALUES (%s)', (trees))
    conn.commit()
conn.close()

값이 열1(NAME)은 title 저장이되고 열2(Category)에는 NULL이부분이 160행 까지 저장되다가 그뒤는 열1(NAME)에 null 열2(Category) trees값이 나오는데 저장방식이 다른건가요? 열1 null값 지우고열2 정렬하고싶은데 정렬이 안되서

1 답변

  • 코드에서는 requests와 BeautifulSoup 라이브러리를 이용해 크롤링한 데이터를 MySQL 데이터베이스에 저장하는 코드를 작성하고 있습니다. 하지만 코드에서 저장하는 데이터가 "title" 변수의 값과 "trees" 변수의 값으로 나뉘어 저장되고 있습니다.

    "INSERT INTO test (Name) VALUES (%s)"는 "Name" 열에 데이터를 저장하는 쿼리이고, "INSERT INTO test (Category) VALUES (%s)"는 "Category" 열에 데이터를 저장하는 쿼리입니다. 따라서 "Name"과 "Category" 열에 저장되는 데이터는 서로 다릅니다.

    이 코드에서는 "Category" 열에 저장할 데이터가 없어서 NULL 값이 저장되고 있습니다. 만약 "trees" 변수의 값을 "Category" 열에 저장하려면 아래와 같이 수정할 수 있습니다.

    for li in lis:
        food = li.select_one('div.common_sp_caption > div.common_sp_caption_tit.line2')
        if food is not None:
            title = food.text
            sql = 'INSERT INTO test (Name, Category) VALUES (%s, %s)'
            cur.execute(sql, (title, trees))
            conn.commit()
    
    

    이렇게 하면 "Name" 열에는 "title" 변수의 값이 저장되고, "Category" 열에는 "trees" 변수의 값이 저장됩니다. "trees" 변수는 for 루프에서 "soup.select_one(f'div:nth-child(1) > a:nth-child({i})').get_text()"로 가져온 값으로, "trees" 변수를 저장하기 전에 for 루프 내부에서 "trees" 변수에 값을 할당해주어야 합니다. 예를 들어 for 루프 내부에서 아래와 같이 "trees" 변수에 값을 할당할 수 있습니다.

    for i in range(2, 17):
        trees = soup.select_one(f'div:nth-child(1) > a:nth-child({i})').get_text()
        sql = 'INSERT INTO test (Category) VALUES (%s)'
        cur.execute(sql, (trees))
        conn.commit()
    
    

    이렇게 하면 "Category" 열에 "trees" 변수의 값이 저장됩니다. 저장된 데이터를 정렬하려면 "ORDER BY" 구문을 사용하여 정렬할 수 있습니다. 예를 들어 "Category" 열로 오름차순 정렬하려면 아래와 같이 쿼리를 작성할 수 있습니다.

    SELECT * FROM test ORDER BY Category ASC;
    

    이렇게 하면 "Category" 열로 오름차순으로 정렬된 데이터가 출력됩니다. 참고로, 위의 쿼리는 모든 데이터를 가져와 정렬하기 때문에 데이터가 많을수록 처리 시간이 오래 걸릴 수 있습니다. 필요한 데이터만 가져와 정렬하면 처리 시간을 단축할 수 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)