반응형

0. 들어가기

-. 게시판 기능이 대강 구현됐으니, 잠시 숨 돌릴겸 dart에 게시되는 전자공시를 가져오는 페이지를 만들어보겟다.

-. python 모듈 중 rss feed를 가져오는 feedparser를 사용해본다.

1. 코드

-. pypi에서 feedparser 설치한다.

pip install feedparser

-. 예제를 따라 간단하게 작성한다. url은 현대모비스를 사용했다. 오늘이 일요일이라 최근 공시는 뜨는게 없다. (일 단위로 뜸)

import feedparser

url = ["http://dart.fss.or.kr/api/companyRSS.xml?crpCd=00164788"]

def RSScrawler(url):
    d = feedparser.parse(url)
    print(type(d))
    print(d)


if __name__ == "__main__":
    RSScrawler(url[0])

-. 이런식으로 json 파일이 출력됨.

<feedparser low data>

-. 내용물을 살짝 정리하면 아래와 같다.

-. 출력을 조금 깔끔하게 정리

import feedparser

url = ["http://dart.fss.or.kr/api/companyRSS.xml?crpCd=00164788"]

def RSScrawler(url):
    d = feedparser.parse(url)
    for each in d['entries']:
        subject = each['title']
        link = each['link']
        pubdate = each['published']
        company = each['author']

        print("회사명: ", company, "공시날짜: ", pubdate)
        print("공시제목: ", subject)
        print("공시링크: ", link)
        print("-------------")



if __name__ == "__main__":
    RSScrawler(url[0])

-. 출력물

2. DB에 저장

-. DB에는 회사명/제목/링크/게시날짜 정도를 저장할 예정이다.

<FeedRepository table>

-. 앞 포스팅과 동일하게 DB 모델설정 및 반영

class FeedRepository(db.Model):
    __tablename__ = "DARTFEED_TB"
    id = db.Column(db.Integer, primary_key=True)
    company = db.Column(db.String(200), nullable=False)
    title = db.Column(db.String(200), nullable=False)
    link = db.Column(db.String(200), nullable=False)
    feedDate = db.Column(db.DateTime(), nullable=False)

-. DB 생성확인

<생성된 DB 확인>

-. DB에 반영하기 위한 코드 작성. 중복은 걸러내고.

def RSScrawler(url):
    #기존 list 확인
    existList = FeedRepository.query.with_entities(FeedRepository.feedNo).all()
    _existList = [each[0] for each in existList]

    for _url in url:
        d = feedparser.parse(_url)
        for each in d['entries']:
            subject = each['title']
            link = each['link']
            pubdate = parse(each['published'])
            company = each['author']
            rcpNo = int(link.split("=")[1])

            if rcpNo not in _existList:
                print("회사명: ", company, "공시날짜: ", pubdate)
                print("공시제목: ", subject)
                print("공시링크: ", link)
                print("-------------")
                feed = FeedRepository(company=company, title=subject, link=link, feedDate=pubdate, feedNo=rcpNo)
                db.session.add(feed)

    db.session.commit()


if __name__ == "__main__":
    RSScrawler(url)  

3. 공시 게시판 생성 및 출력

-. 이전 포스팅과 동일한 구조로 만듬. 하는김에 회사 별 서치 추가 목적으로 회사 몇개 더 받아둠.

<게시판 출력>

-. 다음 포스팅에선 회사별 검색 기능을 추가해야겠다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기