코딩,해볼까

06.20. bs4로 스크랩한 코드를 나의 장고 프로젝트에 합치기 본문

Back/TIL

06.20. bs4로 스크랩한 코드를 나의 장고 프로젝트에 합치기

떠굥 2023. 6. 21. 00:34

🏳️‍🌈 아이디 찾기 , 비밀번호 찾기 구현 해보고 싶다.

FORGOT ID? 구현하기

 

1.  문제점

크롤링을 맡은 팀원의 컴퓨터에서 postgreSQL을 위한 psycopg2 의 오류가 있었다.

이로 인해 크롤링을 다른 레포지토리로 진행하였고, 이를 우리의 프로젝트에 합쳐야 했다.

 

1) db에 저장하여 db를 불러와서 연결하기

2) .json 파일로 만들어 연결하기

3) django model을 만들어 그 모델 안에 크롤링 데이터들이 저장되도록 한다.

 

이 중 2번으로 진행하고 싶어서 자료를 계속해서 찾았지만, 어떻게 해야할 지 모르겠다.

 

2. 시행착오

▪️  JSON, CSV 장고 DB 넣기

▫️  django 공식문서의 json에 대한 내용들

▫️  파이썬의 json 모듈로 JSON 데이터 다루기

▫️  File과 Json을 함께 서버에 전송하는 방법

 

▪️  파이썬 requests를 이용해서 json 데이터를 HTTP POST로 전송 (GET도 비슷하다.) : requests.post() 

import requests

url = 'http://my_server.net/send_json_data/'
my_json_data = [{ "my_key_1": "my_value_1"}, {"my_key_2":"my_value_2"}]

result = requests.post(url, json=my_json_data)
print(result.text)

 

3. 해결방법

모델을 하나 생성하기로 했다.

모델 생성 시 상속으로 생성해보고 싶었는데, 다음에 바꿔보기로 했다. (DB설계 - 클래스 모델 상속)

 

내가 작성한 코드를 실행하기 위한 중요한 단계!

장고가 이 파일에서 셋팅 된 후 models를 가져와야 인식이 된다.

django.setup() 이후에 모델을 import해야 한다.

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', "Backend.settings") # my project name

import django
django.setup()

from {your_app} import models

참고링크>

내가 작성한 코드 파이썬 파일은 manage.py 와 같은 곳에 위치한다.

모델은 아래와 같이 작성한다.

for item in thumbnail_items:
    event_title = item.find(class_="tit").text.strip()
    event_date = item.find(class_="thumb_date").text.split(" ~ ")
    event_img = item.find("img")["src"]
    
    models.EventList(
        title=event_title,
        start_date=event_date[0],
        end_date=event_date[1],
        image=event_img,
    ).save()
더보기
import requests
from bs4 import BeautifulSoup
import os, json, psycopg2, django

 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
django.setup()
from events import models

 

url = "https://www.chf.or.kr/cont/{}/all/month/menu/363?thisPage=1&idx={}&searchCategory1=&searchCategory2={}&searchField=all&searchDate={}&weekSel=&searchText="

 

# view or calendar (개별 이벤트, 전체이벤트 리스트)
view_value = "calendar"

 

# event number - 전체이벤트 리스트 시 빈칸
event_value = ""

 

# 장소
place_value = "617"

 

# 몇월
date_value = "202306"

 

formatted_url = url.format(view_value, event_value, place_value, date_value)

 

html = requests.get(formatted_url)
soup = BeautifulSoup(html.content, "html.parser")



# Find all div elements with class 'thumb_cont'
thumbnail_items = soup.find_all("div", class_="thumb_cont")

 

# Create a list to store the extracted information
event_info = []



for item in thumbnail_items:
    event_title = item.find(class_="tit").text.strip()
    event_date = item.find(class_="thumb_date").text.split(" ~ ")
    event_img = item.find("img")["src"]

 

    # Create a dictionary for the current item
    # item_data = {
    #     "title": event_title,
    #     "date": event_date,
    #     "img": event_img,
    # }

 

    # Add the item data to the list
    # event_info.append(item_data)
    models.EventList(
        title=event_title,
        start_date=event_date[0],
        end_date=event_date[1],
        image=event_img,
    ).save()

 

# Save data as JSON
# with open("event_list.json", "w", encoding="utf-8") as json_file:
#     json.dump(event_info, json_file, ensure_ascii=False, indent=4)

 

# print("Data saved as JSON.")



# ### JSON TO DB



# # Connect to the PostgreSQL database
# conn = psycopg2.connect(
#     host="localhost",
#     database="gwolnadri_db",
#     user="root",
#     password="nadri0605",
# )

 

# # Create a cursor to execute SQL statements
# cursor = conn.cursor()

 

# # Create the table if it doesn't exist
# create_table_query = """
#     CREATE TABLE IF NOT EXISTS event_data (
#         event_title VARCHAR,
#         event_num VARCHAR,
#         event_img VARCHAR,
#         event_date VARCHAR
#     )
# """
# cursor.execute(create_table_query)

 

# # Commit the changes to the database
# conn.commit()

 

# # ...

 

# # Insert each item's data into the PostgreSQL database
# for item_data in event_info:
#     sql = "INSERT INTO event_data (event_title, event_num, event_img, event_date) VALUES (%s, %s, %s, %s)"
#     cursor.execute(
#         sql,
#         (
#             item_data["event_title"],
#             item_data["event_num"],
#             item_data["event_img"],
#             item_data["event_date"],
#         ),
#     )

 

# # ...

 

# # Commit the changes and close the connection
# conn.commit()
# conn.close()

 

# print("Data saved to PostgreSQL database.")



 

4. 알게된 점

▪️ 결국 오타때문에 생긴 오류였지만.. 새로운 오류를 만났다.

class EventListView(APIView):
    def get(self, request):
        serializer = EventListSerializer(EventList, data=request.data)
        return Response(serializer, status=status.HTTP_200_OK)

Assertation Error, You passed a Serializer instance as data, but probably meant to pass serialized `.data` or `.error`. representation

 

▪️ GenericAPIView를 사용해 get 요청 없이도 queryset으로 리스트를 불러올 수 있다.

GenericAPIView 공부하기(1) / GenericAPIView 공부하기(2)

 

▪️ DataField에 대한 개념을 읽고, 직접 사용해봤다.

장고 공식문서

 

.▪️ split() 의 다양한 종류를 알고, 직접 사용해봤다.

.split() 공부하기

 

▪️ json 파일을 연결하면서 os.path 는 경로를 찾아주는 다양한 모듈이 있다는 것을 알았다.

os와 os.path 모듈(1) / os와 os.path 모듈(2) / os.path.join / 장고에서 json파일 읽히지 않습니다.

Comments