Pycharm 버전 : PyCharm 2023.3.3 (Community Edition)

 

1) 가상환경 만들기 설정(conda)

 

 

- Environment name은 사용할 가상환경 명, Python 버전은 되도록 최신을 선택.

 

- 생성후 생성한 가상환경을 선택한후 OK 클릭

 

 

 

 

 

2) django 패키지설치

 

 

 

명령어 : django-admin startproject config .

 

 

 

 

3) 수행환경 설정

Run > **Edit Configurations...**

  1. + 버튼 클릭 후, Python을 선택하여 새로운 구성을 만듭니다.
  2. Name 필드에 구성 이름을 지정합니다. 예: Django Server.
  3. Script path에서 manage.py 파일을 찾아 선택합니다.
  4. Parameters 필드에 runserver를 입력합니다. 필요에 따라 runserver 0.0.0.0:8000과 같이 호스트와 포트를 지정할 수도 있습니다.
  5. Environment variables 필드에 필요한 환경변수를 설정할 수 있습니다. 예를 들어, Django 설정 모듈을 지정할 때 사용합니다.
  6. Python interpreter를 확인하고, 프로젝트에 맞는 인터프리터가 선택되었는지 확인합니다.
  7. Working directory가 프로젝트 디렉토리로 설정되어 있는지 확인합니다.
  8. 설정을 완료한 후, OK를 클릭하여 창을 닫습니다.

 

반응형

'IT > Django-백앤드' 카테고리의 다른 글

Django에서 정기배치 작업 만들기  (0) 2024.02.16

 

Django에서 정기 배치 구현하기

Django에서 정기 배치 작업을 구현하기 위해 Celery와 Django-celery-beat를 활용하는 방법입니다.

1단계: Celery와 Django-celery-beat 설치

필요한 패키지를 설치합니다.

pip install celery django-celery-beat

2단계: Celery 설정

Django 프로젝트의 settings.py에 Celery 설정을 추가합니다.


# settings.py

import os

# Celery 설정
CELERY_BROKER_URL = 'redis://localhost:6379/0'  # Redis를 브로커로 사용
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_TIMEZONE = 'Asia/Seoul'

# Django-celery-beat 설정
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
    

3단계: Celery 앱 생성

Django 프로젝트 내에 Celery 앱을 초기화하는 코드를 추가합니다.


# __init__.py

from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings')

app = Celery('your_project_name')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    

4단계: 정기 배치 작업 생성

특정 작업을 정의하는 Python 함수를 작성하고, Celery의 @app.task 데코레이터를 사용하여 이를 태스크로 등록합니다.


# tasks.py

from celery import shared_task

@shared_task
def my_scheduled_job():
    # 할 일
    print("정기 배치 작업 실행")
    

5단계: 스케줄러 설정

Django-celery-beat를 사용하여 정기적으로 실행될 작업을 스케줄링합니다.

6단계: Celery 워커와 비트 실행

Celery 워커와 Celery Beat 스케줄러를 실행합니다.


# Celery 워커 실행
celery -A your_project_name worker --loglevel=info

# 별도의 터미널에서 Celery Beat 실행
celery -A your_project_name beat --loglevel=info
    

이제 설정한 간격에 따라 my_scheduled_job 태스크가 자동으로 실행됩니다.

반응형

'IT > Django-백앤드' 카테고리의 다른 글

django 프로젝트 생성 (pycharm에서 설정)  (0) 2024.02.16

기업에서는 폐쇄된 인프라에서 개발을 진행해야할 때가 있습니다.

 

이때 인터넷에서 연결된 PC 에서 폐쇄망 PC로 한번에 패키지를 가져오는 방법을 공유합니다.

 

===================================================

인터넷PC

===================================================

 

1)npm 캐시경로 찾기 및 파일zip

명령어 : npm config get cache
수행결과 : C:\Users\......\AppData\Local\npm-cache

2) 해당 npm-cache 폴더를 압축

 

3) 해당 압축파일을 폐쇄망PC로 전송

 

===================================================

폐쇄망PC

===================================================

 

1) npm-cache 파일은 압축풀기

 

 

2) npm을 캐시폴더로 지정
명령어 : npm config set cache 압축을푼경로복사 --global

3)캐시폴더의 패키지 인스톨
명령어 : npm install 

 

이렇게 하면 모든 패키지를 한번에 설치할 수 있습니다.

 

저는 react 관련된 mui 부터 d3까지 한번에 설치되는걸 확인할 수 있었습니다.

 

 

반응형

목적

- https://www.data.go.kr/ 에서 제공하는 분양권 데이터를 요청시마다 실시간으로 수신

- '국토교통부_아파트매매 실거래 상세 자료' 에 해당한느 API

 

 

1. 라이브러리 Import

# 1-1. 데이터 가져오기
import requests
import datetime
import json
import xmltodict
import pandas as pd 
from pandas import json_normalize
from sqlalchemy import create_engine
import pymysql
import pandas as pd
import numpy as np
import time
import datetime
import pytz
from datetime import datetime

 

 

2. API의 url 과 발급받은 service key 정의

url ="http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcSilvTrade?"
service_key = "Data.go.kr에서 신청해서 받은Key"

 

3. 입수일자와 시각을 알기위한 변수정의

- 프로그램 수행시 현재일자, 현재시각을 가지고옴

- base_dt 는 현재 수행되는 기준의 년월을 가지고옴 ex) 2023-02-06 수행시 2023-02 

- base_dt로 수행월에 발생한 데이터를 가지고옴

#  기준일자, 기준시각 추가
now = datetime.now(pytz.timezone('Asia/Seoul'))
nowDate = now.strftime('%Y%m%d')
nowTime = now.strftime('%H%M')

base_dt = nowDate[:6]

 

 

4. 행정동 Code를 df1에 미리 셋업해놓음

 

 

 

5. 크롤링 Main 부분

- XML형태이므로 각각 구조에 따라 파싱

- 현재까지 크롤링 기준으로 예외사항에 대해 각각 예외처리 하였으나, 추가로 발견시에는 코멘트 요망

for lawd_cd in df1['LAWD_CD']:
    payload = "LAWD_CD=" + lawd_cd + "&" + \
              "DEAL_YMD=" + base_dt + "&" + \
              "serviceKey=" + service_key + "&" 

    response = requests.get(url + payload) 

    res_json = xmltodict.parse(response.text) # 문자열을 XML을 JSON 형식으로 변환합니다.
    
    # 건수없으면 Skip 처리함.
    if(res_json['response']['body']['totalCount']!='0'):
        jsonString = json.dumps(res_json['response']['body']['items']['item'], ensure_ascii=False)      # 변환된 JSON 형식을 Dictionary 문자열로 변환합니다.
    else:
        print(lawd_cd,'건수없음')
        continue
        
        
    jsonObj = json.loads(jsonString) 
    if type(jsonObj) == list:
        df = pd.DataFrame.from_dict(jsonObj)
    else:
        #dict 반환후 전치시켜야 컬럼 읽기가능.
        df = pd.DataFrame.from_dict(jsonObj,orient='index').T
    
    if firstyn == 'Y':
        df2 = pd.DataFrame(index=range(0,0), columns=df.columns)
        firstyn = 'N'
        
    df2 = df2.append(df,ignore_index=True)
    time.sleep(1)
    print(type(jsonObj), lawd_cd)
    i=i+1

 

6. 분양권 실거래가 출력

반응형

목적

- 네이버 쇼핑의 '쇼핑몰리뷰'의 평점과 텍스트 크롤링

 

1. 필요사항 Import

- 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임

# step1.프로젝트에 필요한 패키지 불러오기
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd
import requests
import re
import numpy as np


from selenium.webdriver.common.keys import Keys

 

 

2. 크롬드라이버 설정 및 로그인 정보전달

header = {'User-Agent': ''}
d = webdriver.Chrome('C:/Users/XXXXXXXXX/Downloads/chromedriver.exe') # webdriver = chrome
shoppingmall_review="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[2]/div/div[2]/ul/li[4]/a/strong"

#함수 선언
def add_dataframe(dit,reviews,stars,cnt):  #데이터 프레임에 저장
    #데이터 프레임생성
    df1=pd.DataFrame(columns=['크롤링구분','리뷰','평점'])
    n=1
    if (cnt>0):
        for i in range(0,cnt-1):
            df1.loc[n]=[dit[i],reviews[i],stars[i]] #해당 행에 저장
            i+=1
            n+=1
    else:
        df1.loc[n]=['null','null','null']
        n+=1    
    return df1

 

3. 크롤링 대상 물품을 선정하고 URL로 정리 후 크롤링진행[Main]

**df2에 해당하는 데이터

- 실제 수집URL을 회사별로 관리하고 아래 for문에서 해당 df2를 순회하며 크롤링진행

- 파일로 담아놓아도 되고 DB Table형태로 관리해도 됨(개인적으로 Table형태를 선호함)

 

df1 = pd.DataFrame(columns=['크롤링구분','평점','리뷰'])
df4 = pd.DataFrame(columns=['크롤링구분','평점','리뷰'])

for dit,ns_address in zip(df2['크롤링구분'],df2['수집URL']):
    
    #print(name_, category_ ,ns_address, "\n")
    
    d.implicitly_wait(3)
    d.get(ns_address)
    req = requests.get(ns_address,verify=False)
    html = req.text 
    soup = BeautifulSoup(html, "html.parser")
    sleep(2)

    element=d.find_element_by_xpath(shoppingmall_review)
    d.execute_script("arguments[0].click();", element)
    sleep(2)

    # 리뷰 가져오기
    reviews=[]
    stars=[]
    total_list=[]
    cnt=1   #리뷰index
    page=1
       

    while True:
        
        j=1
        sleep(2)
        while True: #한페이지에 20개의 리뷰, 마지막 리뷰에서 error발생
            try:                              
                star=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li[1]/div[1]/span[1]').text
                star = star.replace("평점","")
                review=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li['+str(j)+']/div[2]/div[1]/p').text
                #reviews.append(review)
                total_list.append((dit,star,review))
                if j%2==0: #화면에 2개씩 보이도록 스크롤
                    ELEMENT = d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li['+str(j)+']/div[2]/div[1]/p')
                    d.execute_script("arguments[0].scrollIntoView(true);", ELEMENT)       
                j+=1
                cnt+=1 
            except: 
                break

        sleep(2)
        
        if page<11:#page10까지 적용
            try: #리뷰의 마지막 페이지에서 error발생
                page +=1
                next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a['+str(page)+']').click() 
            except: 
                break
        else :
            try: #page11부터
                page+=1
                if page%10==0: 
                    next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a[11]').click()
                elif page%10==1: 
                    next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a[12]').click()
                else : 
                    next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a['+str(page%10+1)+']').click()
            except: 
                break 

df4 = pd.DataFrame(total_list, columns=['크롤링구분','평점','리뷰'])
    #df4=add_dataframe(dit,reviews,stars,cnt)

 

 

4. Data Frame 출력결과

 
 

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

목적 - 감정분석을 위해 네이버 영화평점을 크롤링 하는 파이썬 프로그램작성 - 무작위의 네이버 영화 평점별 리뷰 데이터 크롤링 https://movie.naver.com/movie/point/af/list.naver? 평점 : 네이버 영화 네티

comemann.tistory.com

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

목적 - 잡플래닛의 기업리뷰정보를 크롤링 1. 필요사항 Import 및 잡플래닛 ID와 PW기입 - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import

comemann.tistory.com

2023.02.02 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

목적 - 네이버 쇼핑의 '쇼핑몰리뷰'의 평점과 텍스트 크롤링 1. 필요사항 Import - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import Beautiful

comemann.tistory.com

 

반응형

목적

- 잡플래닛의 기업리뷰정보를 크롤링

 

 

 

 

1. 필요사항 Import 및 잡플래닛 ID와 PW기입

- 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임

# step1.프로젝트에 필요한 패키지 불러오기
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd
import requests
import re
import numpy as np


from selenium.webdriver.common.keys import Keys


# step2.로그인 정보 및 검색할 회사 미리 정의, 해당 회사의 리뷰 끝 페이지도 정의
usr = ""
pwd = ""

 

 

2. 크롬드라이버 설정 및 로그인 정보전달

# step3.크롬드라이버 실행 및 잡플래닛 로그인
driver = webdriver.Chrome("C:/Users/XXXXXX/Downloads/chromedriver.exe")

driver.get("https://www.jobplanet.co.kr/users/sign_in?_nav=gb")
time.sleep(5)

login_id = driver.find_element_by_css_selector("input#user_email")
login_id.send_keys(usr)

login_pwd = driver.find_element_by_css_selector("input#user_password")
login_pwd.send_keys(pwd)

login_id.send_keys(Keys.RETURN)
time.sleep(5)
k=0

 

 

3. 리스트 변수 정의

# step4.크롤링한 정보를 담을 리스트명 정의
list_div = []
list_cur = []
list_date =[]
list_stars = []
list_summery = []
list_merit = []
list_disadvantages = []
list_managers =[]
all_total_data = pd.DataFrame()

 

4. 크롤링 대상 회사를 선정하고 URL로 정리 후 크롤링진행[Main]

**df2에 해당하는 데이터

- 실제 수집URL을 회사별로 관리하고 아래 for문에서 해당 df2를 순회하며 크롤링진행

- 파일로 담아놓아도 되고 DB Table형태로 관리해도 됨(개인적으로 Table형태를 선호함)

for name,dit,ns_address,page in zip(df2['이름'],df2['크롤링구분'],df2['수집URL'],df2['설명']):
    
    
    
    
    page = int(page)
    # step5.원하는 회사의 리뷰 페이지까지 이동
    header = {'User-Agent': ''}
    driver.implicitly_wait(3)
    driver.get(ns_address)
    req = requests.get(ns_address,verify=False)
    html = req.text 
    soup = BeautifulSoup(html, "html.parser")
    
    if k ==0:
        driver.find_element_by_css_selector("button.btn_close_x_ty1 ").click()
        time.sleep(3)
    
    # step6.원하는 회사의 직무/근속여부/일시/요약/평점/장점/단점/경영진에게 바라는 점 크롤링 (for문으로 반복)
    for i in range(page): 
        
        try:
            user_info = driver.find_elements_by_css_selector("span.txt1")
            count = int(len(user_info)/4)
            list_user_info = []

            #별점
            stars = driver.find_elements_by_css_selector("div.star_score")
            for j in stars:
                a = j.get_attribute('style')
                if a[7:9] == '20':
                    list_stars.append("1")
                elif a[7:9] == '40':
                    list_stars.append("2")
                elif a[7:9] == '60':
                    list_stars.append("3")
                elif a[7:9] == '80':
                    list_stars.append("4")
                else:
                    list_stars.append("5")
            
            #요약 정보
            summery = driver.find_elements_by_css_selector("h2.us_label")

            for j in summery:
                list_summery.append(j.text)

            #장점, 단점, 경영진에게 바라는 점
            list_review = []

            review = driver.find_elements_by_css_selector("dd.df1")

            for j in review:
                list_review.append(j.text)            
            for j in range(count):            #한 페이지에 정보 5set씩 나옴. 마지막 페이지는 5개 미만일 수 있으므로 count 변수를 반복횟수로 넣어줌.
                a = list_review[3*j]
                list_stars.append("5")
                list_summery.append(a)
                #list_merit.append(a)

                b = list_review[3*j+1]
                list_stars.append("1") 
                list_summery.append(b)
                #list_disadvantages.append(b)
                
        except:
            # 다음 페이지 클릭 후 for문 진행, 끝 페이지에서 다음 페이지 클릭 안되는 것 대비해서 예외처리 구문 추가
            try:
                driver.find_element_by_css_selector("a.btn_pgnext").click()
                time.sleep(15)
            except:
                print("break1")
                break

            
        # 다음 페이지 클릭 후 for문 진행, 끝 페이지에서 다음 페이지 클릭 안되는 것 대비해서 예외처리 구문 추가
        try:
            driver.find_element_by_css_selector("a.btn_pgnext").click()
            time.sleep(15)
        except:
            break
            print("break2")
                
    
    print(name, i)
    k=k+1
    # step7.pandas 라이브러리로 표 만들기
    total_data = pd.DataFrame()
    total_data['크롤링구분'] = '잡플래닛'
    total_data['평점'] = pd.Series(list_stars)
    total_data['리뷰'] = pd.Series(list_summery)

 

 

5. Data Frame 출력결과

total_data

 

 

 

 

 

 

 

 

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

목적 - 감정분석을 위해 네이버 영화평점을 크롤링 하는 파이썬 프로그램작성 - 무작위의 네이버 영화 평점별 리뷰 데이터 크롤링 https://movie.naver.com/movie/point/af/list.naver? 평점 : 네이버 영화 네티

comemann.tistory.com

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

목적 - 잡플래닛의 기업리뷰정보를 크롤링 1. 필요사항 Import 및 잡플래닛 ID와 PW기입 - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import

comemann.tistory.com

2023.02.02 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

목적 - 네이버 쇼핑의 '쇼핑몰리뷰'의 평점과 텍스트 크롤링 1. 필요사항 Import - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import Beautiful

comemann.tistory.com

 

반응형

 

목적

- 감정분석을 위해 네이버 영화평점을 크롤링 하는 파이썬 프로그램작성

- 무작위의 네이버 영화 평점별 리뷰 데이터 크롤링

 

https://movie.naver.com/movie/point/af/list.naver? 

 

평점 : 네이버 영화

네티즌 평점과 리뷰 정보 제공

movie.naver.com

 

 

1. 관련 라이브러리 Import

import requests
from selenium import webdriver
import time
from bs4 import BeautifulSoup
import pandas as pd
import random
import urllib.parse as parse
from sqlalchemy import create_engine
import pymysql

from selenium.webdriver.common.keys import Keys

 

2. 반복문으로 1000페이지까지 크롤링진행


results = []
for i in range(1, 1001):
    url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'.format(i)
    r = requests.get(url)
    bs = BeautifulSoup(r.text, "lxml")
    trs = bs.select("table.list_netizen > tbody > tr")
    for tr in trs:  #다수의 평점

        number = tr.select_one("td.ac.num").text
        writer = tr.select_one("td.num > a.author").text
        tr_data = tr.select_one("td.title")
        title = tr_data.select_one("a").text

        point = tr_data.select_one("div.list_netizen_score > em").text
        if point =='1' or point =='2':
            point = '1'
        elif point =='3' or point =='4':
            point = '2'
        elif point =='5' or point =='6':
            point = '3'
        elif point =='7' or point =='8':
            point = '4'       
        else:
            point = '5' 
        # td class="title" 태그에서 a, div, br 태그 제거
        # extract() 함수는 태그와 태그의 내용까지 모두 제거
        [x.extract() for x in tr_data.select("a")]
        [x.extract() for x in tr_data.select("div")]
        [x.extract() for x in tr_data.select("br")]


        content = tr_data.text.strip()
        #리뷰가 없으면 건너뛰자
        if content ==None:
            continue
        
        results.append(('네이버영화',point,content))

 

3. 필요한 컬럼 Select

df = pd.DataFrame(results, columns=['크롤링구분','평점','리뷰'])
df

 

4. 결과 Dataframe으로 출력

 

 

- 해당 데이터로 최신의 리뷰들로 학습데이터를 얻을수 있었음

- 꽤 많은 데이터를 Class(평점)분류 에 따라 수집할 수 있음

 

 

 

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버영화 코멘트/평점 Python 크롤링

목적 - 감정분석을 위해 네이버 영화평점을 크롤링 하는 파이썬 프로그램작성 - 무작위의 네이버 영화 평점별 리뷰 데이터 크롤링 https://movie.naver.com/movie/point/af/list.naver? 평점 : 네이버 영화 네티

comemann.tistory.com

2023.02.01 - [IT/Python] - [Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 잡플레닛 코멘트/평점 Python 크롤링

목적 - 잡플래닛의 기업리뷰정보를 크롤링 1. 필요사항 Import 및 잡플래닛 ID와 PW기입 - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import

comemann.tistory.com

2023.02.02 - [IT/Python] - [Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

 

[Web크롤링] 감정분석을 위한 네이버 쇼핑 코멘트/평점 Python 크롤링

목적 - 네이버 쇼핑의 '쇼핑몰리뷰'의 평점과 텍스트 크롤링 1. 필요사항 Import - 잡플래닛은 로그인을 해야 리뷰가 보이는 사이트임 # step1.프로젝트에 필요한 패키지 불러오기 from bs4 import Beautiful

comemann.tistory.com

 

반응형

 

 

목적

- OpenDart를 사용해 공시데이터를 조회

- OpenDart에서 Key로 사용하는 기업코드(corp_code)를 받아와서 Data Frame으로 저장

- 추후 해당 기업코드로 다양한 OpenDart API 활용

 

 

 

기본적인 라이브러리 들을 Import합니다

import pandas as pd
import requests
import xml.etree.ElementTree as et
from io import BytesIO
from zipfile import ZipFile
import urllib3

 

 

해당 구조로 하는 이유는 다른 API 접속 프로그램을 만들때 url_json과 params 부분만 수정 및 추가해주면 되기 때문입니다.

 

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) #워닝 메시지 미출력


#[1]  고유번호조회
### OPENDART 개발 가이드
url_json = 'https://opendart.fss.or.kr/api/corpCode.xml'
api_key = '발급받은APIKey'

params = {
    'crtfc_key': api_key,
}

 

 

Zipfile형태는 file로 로드한 뒤에 읽어내야 합니다.

 

아래처럼 requests로 불러온뒤 XML을 다운받은 후 string으로 읽습니다.

# OpenDART에서 Zipfile 받아와 객체에 저장하기
u = requests.get(url_json, params=params,verify=False)
zipfile_bytes = u.content
zipfile_obj = ZipFile(BytesIO(zipfile_bytes))

# 압축을 풀어서 XML File을 string으로 담기
xmlfile_objs = {name: zipfile_obj.read(name) for name in zipfile_obj.namelist()}
xml_str = xmlfile_objs['CORPCODE.xml'].decode('utf-8')

 

 

읽어서 Dataframe에 담는 부분입니다.

반복문을 사용해 읽어냅니다.


# XML String을 가져와서 DataFrame에 담기
xroot = et.fromstring(xml_str)

df_cols = ["corp_code", "corp_name", "stock_code", "modify_date"]
rows = []

for node in xroot: 
    res = []
    for el in df_cols[0:]: 
        if node is not None and node.find(el) is not None:
            res.append(node.find(el).text)
        else: 
            res.append(None)
    rows.append({df_cols[i]: res[i] 
                  for i, _ in enumerate(df_cols)})

df_cor = pd.DataFrame(rows, columns=df_cols)

 

 

아래처럼 잘 들어오는것을 확인할 수 있습니다.

반응형

+ Recent posts