융융이'Blog

한경 컨센서스 크롤링(Python, selenium...) 본문

Toy_Project

한경 컨센서스 크롤링(Python, selenium...)

바로퇴장 2020. 1. 8. 19:34
반응형

한경 컨센서스 크롤링

환경 : Jupyter notebook

Version : 파이썬3.4

내용 : 5년 간 작성된 한경 컨센서스 증권 보고서를 크롤링

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import time
## pdf 파싱하기
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO
from io import open
from urllib.request import urlopen

## pdf 다운로드를 위한 import
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options

## 데이터 저장
import pandas as pd
import numpy as np

## 크롬 경로설정
chrome_path = './chromedriver' 
browser = webdriver.Chrome(chrome_path)
# browser.implicitly_wait(1)
page_num = 1
board_index = 1
start_date = "2015-01-05"
end_date = "2020-01-05"
base_url = "http://consensus.hankyung.com"
browser.get("http://consensus.hankyung.com/apps.analysis/analysis.list?sdate="+str(start_date)+"&edate="+str(end_date)+"&now_page="+str(page_num)+"&search_value=&report_type=&pagenum=80&search_text=&business_code=")
##pdf 파일 파싱하기
def read_pdf_file(pdfFile):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)

    process_pdf(rsrcmgr, device, pdfFile)
    device.close()

    content = retstr.getvalue()
    retstr.close()
    return content

##web pdf타입 사이트 pdf 파일을 다운받기
def download_pdf(lnk):
    download_dir = "/Users/huiyung/Desktop/stockCrawling" # for linux/*nix, download_dir="/usr/Public"
    options = webdriver.ChromeOptions()
    profile = {"plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}], # Disable Chrome's PDF Viewer
                "download.default_directory": download_dir ,
               "download.prompt_for_download": False, #To auto download the file
               "plugins.always_open_pdf_externally": True,
               "download.extensions_to_open": "applications/pdf"}
    options.add_experimental_option("prefs", profile)
    driver = webdriver.Chrome('./chromedriver', chrome_options=options)  # Optional argument, if not specified will search path.


    driver.get(lnk)
    time.sleep(3)
    driver.close()
    pdf_title = board_pdf_url.split('=')[1]
    pdf_file = open(pdf_title+".pdf", "rb")
    pdf_content = read_pdf_file(pdf_file)
    return pdf_content

##로컬 파일 불러오기
#pdf_file_test = open("547325.pdf", "rb")     
#contents = read_pdf_file(pdf_file_test)
##해당 pdf 파일 다운로드
#download_pdf("http://consensus.hankyung.com/apps.analysis/analysis.downpdf?report_idx=547354")

board_category = ""
board_title = ""
board_reference = ""
board_pdf_href = ""
board_pdf_content = ""
html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')

while board_index < 80:
    board_date = soup.select("#contents > div.table_style01 > table > tbody > tr:nth-child("+str(board_index)+") > td.first.txt_number")[0].get_text()
    board_title = soup.select("#contents > div.table_style01 > table > tbody > tr:nth-child("+str(board_index)+") > td.text_l > a")[0].get_text()
    board_category = soup.select("#contents > div.table_style01 > table > tbody > tr:nth-child("+str(board_index)+") > td:nth-child(2)")[0].get_text()
    board_reference = soup.select("#contents > div.table_style01 > table > tbody > tr:nth-child("+str(board_index)+") > td:nth-child(5)")[0].get_text()
    board_pdf_url = soup.select("#contents > div.table_style01 > table > tbody > tr:nth-child("+str(board_index)+") > td:nth-child(6) > div > a")[0]['href']
    board_pdf_content = download_pdf(base_url+"/"+board_pdf_url)
    print(str(page_num)+"페이지의"+str(board_index)+"번째까지 게시글 확인 완료")
    board_index += 1
board_index = 1


write_wb.save(filename = 'report_data.xlsx')
## 기본 정보 파싱 완료
browser.close()

동작 구성

해당 페이지 이동 > 제목, 작성일, 유형 파싱 > PDF 링크 클릭 > Chrome PDF web 다운로드하고 스크랩 > 반복

문제점

Pdfminer 패키지를 import하여 크롤링을 시도를 했는데, 패키지가 pdf의 내용이 너무 많으면 중간에 skip을 해버리는 문제가 발생하여 보고서의 모든 내용을 스크랩을 하지 못했다. 또한 보고서에 있는 차트나 도표를 내용을 스크랩해오는 과정에서 불규칙적인 형태로 스크랩을 하여 데이터의 형태가 좋지가 않았다.

반응형

'Toy_Project' 카테고리의 다른 글

Jenkins를 이용한 CI/CD  (1) 2020.10.23
댓글 성향 분석(LSTM)  (0) 2020.02.23
1 Comments
댓글쓰기 폼