通过新闻滚动进行企业破产预测模型研究。

利用文本挖掘进行企业破产预测模型的研究,我们进行了新闻爬取。我们将利用新闻文本数据进行预测准确度和性能研究。

10
通过新闻滚动进行企业破产预测模型研究。

본文章是哈希爬虫在之前进行的研究中讨论的利用文本挖掘进行企业破产预测模型研究过程中的一个项目。

0. 概述

基于类似主题的先行研究,研究了在破产预测过程中应用类似新闻文本等数据的方法是否可以提高破产预测的准确性,以及通过人工智能是否可以提高预测性能。

1. 从网络媒体收集原始数据

原始数据设定为2010年至2021年间发布的新闻。

我们采用了通过在'네이버 뉴스'平台上搜索公司名称进行爬取的方式。

然而,有一件事情需要注意。由于韩国注册了大量公司,而且新闻数量也非常庞大,因此在规定的时间内收集所有新闻数据是非常困难且耗时的工作。因此,尽可能快速且准确地收集数据是至关重要的。

  • 时间问题

  • 新闻数据重复问题

  • 数据容量问题

  • 排除广告新闻数据相关问题

2. 新闻数据收集过程

步骤1. 我们决定按照以下步骤进行收集。

notion image

notion image

步骤2. 编写代码

我们编写了以下代码,并通过测试进行审查。

column_ = ['기업', '기사발행일', '기사제목', '뉴스기사본문']
뉴스_df = pd.DataFrame(columns=column_)

driver = webdriver.Chrome()

회사명_ = 상폐기업['회사명']
종료연도_ = 상폐기업['종료연도']
종료월_ = 상폐기업['종료월']
종료일_ = 상폐기업['종료일']
시작연도_ = 상폐기업['시작연도']
시작월_ = 상폐기업['시작월']
시작일_ = 상폐기업['시작일']

# start = '2010.01.01'
# end = '2010.12.31'
# start_= '20100101'
# end_ = '20101231'

for 기업, 종료연도, 종료월, 종료일, 시작연도, 시작월, 시작일 in  zip(회사명_, 종료연도_, 종료월_, 종료일_, 시작연도_, 시작월_, 시작일_):

    start = (시작연도 + '.' + 시작월 + '.' + 시작일)
    end = (종료연도 + '.' + 종료월 + '.' + 종료일)
    start_= (시작연도 + 시작월 + 시작일)
    end_ = (종료연도 + 종료월 + 종료일)

    # 나중에 뉴스_df와 concat할 임시 df 생성 및 임시 리스트들 생성
    column_ = ['기업', '기사발행일', '기사제목', '뉴스기사본문']
    임시_df = pd.DataFrame(columns=column_)

    # 임시_df에 들어갈 리스트 생성
    본문리스트 = []
    날짜리스트 = []
    제목리스트 = []
    기업이름 = []

    # while 종료 조건으로 쓸 리스트 생성
    newslist = []
    datelist = []

    page = 1

    # 페이지수가 나와있지않으므로 맨끝에 page에 10씩더해서 계속 다음페이지로 이동
    # 20페이지 이후로는 광고 등 불필요한 기사가 많아 페이지를 20페이지로 한정한다.
    while page < 200:

        url = 'https://search.naver.com/search.naver?where=news&sm=tab_pge&query='+'"'+기업+'"'+'&sort=0&photo=0&field=0&pd=3&ds='+start+'&de='+end+'&cluster_rank=19&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:from'+start_+'to'+end_+',a:all&start='+str(page)'
        driver.get(url)

        response = requests.get(url)
        soup = BeautifulSoup(response.text, "lxml")

        # a태그중에서 class가 info인 것과 span태그에 class가 info 인 것 가져옴
        news_titles = soup.select("a.info")
        dates = soup.select('span.info')

        # 네이버기사와 신문사기사 둘다 하이퍼링크가 있을경우는 기사당 news가 2개씩 네이버 기사가 없을 경우는 1개씩만 링크가 추출된다
        # 어림잡아 news_titles수가 10개 미만일 경우는 기사의 수가 5개에서 10개 미만이라는 뜻으로 해석하여 10개 이상만 링크와 기사날짜를 추출
        if len(news_titles) >= 10:

            for news in news_titles:
                title = news.attrs['href']
                newslist.append(title)

            for date in dates:
                news_date = date.text
                datelist.append(news_date)

            # 네이버 검색시 page number가 다음페이지로 갈때마다 1, 11, 21 이렇게 10씩 더해지는데 다음페이지가 없을경우
            # 마지막 기사만을 포함한 같은 페이지를 계속 반환함. 따라서 기사와 날짜 둘 다 중복되서 저장될경우 종료함
            if (newslist[-1]==newslist[-2]) & (datelist[-1]==datelist[-2]):
                break

            page += 10

            time.sleep(1)

        # 기사수 5개 미만시 break, 기사없는기업 리스트에 저장함
        else:

            break

    # sid=101은 네이버 경제기사를 의미하는 듯함. 경제기사만 추출
    newslist = [news for news in newslist if 'sid=101' in news]

    # news_titles 뉴스기사 url 리스트가 존재시
    if news_titles:

        # 뉴스기사 url 자체에서는 text가 안가져와지는 특이사항 발생, 찾아보니 네이버기사는 인터넷에 떠야 페이지가 작동하는? 방식이라함
        # 셀레니움을 통해서 뉴스기사 url 주소로 창을 띄움
        for news in newslist:
            url = news
            driver.get(url)

            # 뉴스기사 url에서 본문과 제목, 기사작성날짜를 리스트에 저장함
            # 데이터프레임에 직접 행을 지정해주기는 번거로움..
            try:

                날짜 = driver.find_element('xpath', '//*[@id="ct"]/div[1]/div[3]/div[1]/div/span').text
                날짜리스트.append(날짜)

                제목 = driver.find_element('xpath', '//*[@id="ct"]/div[1]/div[2]/h2').text
                제목리스트.append(제목)

                본문 = driver.find_element('xpath', '//*[@id="dic_area"]').text
                본문리스트.append(본문)
                time.sleep(1)

                기업이름.append(기업)

            ## 로딩이 안되서 데이터를 못가져올 경우를 대비해 sleep 3초 주고 다시 시도
            except:

                time.sleep(3)

                try:

                    날짜 = driver.find_element('xpath', '//*[@id="ct"]/div[1]/div[3]/div[1]/div/span').text
                    날짜리스트.append(날짜)

                    제목 = driver.find_element('xpath', '//*[@id="ct"]/div[1]/div[2]/h2').text
                    제목리스트.append(제목)

                    본문 = driver.find_element('xpath', '//*[@id="dic_area"]').text
                    본문리스트.append(본문)
                    time.sleep(1)

                    기업이름.append(기업)

                # 그래도 데이터를 가져오지 못하는 경우는 페이지에 문제가 있다고 판단하여 PASS
                except:

                    pass

    # 혹시나 뉴스기사 url 리스트가 없을 경우는 pass
    else:
        pass

    # 기업별로 가져온 날짜와 본문, 제목, 기업이름을 임시 데이터프레임으로 저장
    임시_df.기사발행일 = 날짜리스트
    임시_df.뉴스기사본문 = 본문리스트
    임시_df.기사제목 = 제목리스트
    임시_df.기업 = 기업이름

    # 임시 데이터프레임을 뉴스 데이터프레임에 아래로 결합
    뉴스_df = pd.concat([뉴스_df, 임시_df])

# 앞에서 while 종료 조건이 같은 기사 2번저장인데 이럴 경우 중복으로 저장이 되야 종료되기때문에
# 중복기사 행 제거
뉴스_df.drop_duplicates(inplace=True)
뉴스_df.to_csv('../Step3_1_뉴스전처리/news/상폐기업뉴스.csv', index=None)

3. 面临的问题

在开发采集爬虫时,最大的问题可能是服务器和速度。

如果个人直接管理服务器和速度,可能会遇到以下问题,因此请注意。

  1. 耗时延迟无限增加

  2. 如果只使用一个IP,可能会导致大量流量而出现封锁问题

  3. 如果频道更新,由于HTML结构的更改,会导致维护成本增加

您可能已经使用了各种库,尝试使用VPN更改IP。如果遇到难以直接管理的情况,或者需要一次性建立大数据时,考虑使用市场上已有的各种解决方案可能更有效率,因此建议考虑引入。

4. 需要注意的事项

构建大数据的最大目的无疑是研究用途占据了最大比例。

但是,由于爬取是一种技术,主要是将初步数据筛选的判断交给机器而不是人类,因此除了简单的技术问题外,还必须考虑道德和伦理方面。

特别是访问个人信息等敏感数据需要特别小心。因此,为了确保所有数据收集都能够透明和公正进行,应尽最大努力。

这个过程可能不会被所有人注意到,但可以让我们的研究变得更有价值。

如果在进行爬取时遇到困难,可以参考我们的博客文章或者随时与我们联系。

也一起阅读这篇文章:

数据收集,现在自动化吧

无需编码,5分钟即可开始 · 5,000多个网站爬取经验

免费开始 →

Comments

Add Comment

Your email won't be published and will only be used for reply notifications.

继续阅读

Get notified of new posts

We'll email you when 해시스크래퍼 기술 블로그 publishes new content.

Your email will only be used for new post notifications.