본문 바로가기
데이터&AI/금융데이터

홍콩 주식 공시정보 크롤링하기 (w. python)

by 일등박사 2023. 11. 30.
728x90

2023.11.27 - [일등박사의 생각/데이터분석] - 홍콩주식 공시 확인하기!! (feat. 텐센트 배당공시 확인하기)

2023.11.28 - [일등박사의 생각/데이터분석] - 미국주식 공시 확인하기!! (feat. 애플 배당공시 확인하기)

2023.11.29 - [일등박사의 생각/데이터분석] - 미국 주식 공시 Edgar 크롤링하기 (w. python)

 

기존 포스팅에 이어 이번에는 홍콩 주식의 공시정보를

크롤링하는 방법을 알아보겠습니다!

 


홍콩주식의 경우 hkex 사이트에 공시가 공지됩니다!!

https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en

 

Listed Company Information Title Search

 

www1.hkexnews.hk

 

1. stockID 정보 수집하기

HKEX 사이트에서는 종목의 티커정보가 아닌 stockID정보를 기반으로

종목을 구분하고 있었습니다.

 

이에 먼저 티커정보를 바탕으로 stockID를 확인합니다!

import requests
import pandas as pd
from bs4 import BeautifulSoup
# API 엔드포인트와 매개변수 설정
import json
import re
headers = [
{'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' },

]
item_ticker = '00700'
stockId_url = f"https://www1.hkexnews.hk/search/prefix.do?&callback=callback&lang=EN&type=A&name={item_ticker}&market=SEHK"
stockId_req = requests.get(stockId_url, headers=headers[0])
stockId_req

# 정규표현식을 사용하여 괄호 안의 내용 추출
match = re.search(r'\((.*?)\)', stockId_req.text)

if match:
    content_inside_parentheses = match.group(1)
    json.loads    (content_inside_parentheses)
    stockId= json.loads(content_inside_parentheses)['stockInfo'][0]['stockId']
    print(f"stockId : {stockId}")
else:
    print("괄호 안의 내용을 찾을 수 없습니다.")

 

지난번과 동일하게 TENCENT(00700)을 기준으로 확인해보았구요!!

stockID는 7609 임을 알 수 있었습니다.

 

2. 공시 리스트  정보 수집하기

지난 미국 공시 수집과 동일한데요!!

확보된 stockId를 바탕으로 해당 종목의 공시 리스트 정보를 수집합니다.

headers = [
{'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' },

]
gongsiList_url = "https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en"
req_data = {
    'lang': 'EN',
    'category': '0',
    'market': 'SEHK',
    'searchType': '0',
    'documentType': '',
    't1code': '',
    't2Gcode': '',
    't2code': '',
    'stockId': stockId,
    'from': '19990401',
    'to': '20231127',
    'MB-Daterange': '0'
}

gongsiList = requests.post(gongsiList_url,  data=req_data, headers=headers[0])
gongsiList

 

이후 그 결과물을 html 로 파싱하면!!

# BeautifulSoup을 사용하여 HTML 파싱
soup = BeautifulSoup(gongsiList.text, 'html.parser')

# 특정 클래스 이름을 가진 테이블 찾기
table_class_name = "table sticky-header-table table-scroll table-mobile-list"
table = soup.find('table', {'class': table_class_name})

# 테이블의 각 행과 열 데이터 출력
table_l = []
if table:
    rows = table.find_all('tr')
    for row in rows:
        cols = row.find_all(['th', 'td'])
        cols = [col.text.strip().replace('\t','').replace('\n','') for col in cols]
        
        doc_link = row.find('div', class_='doc-link')
        if doc_link:
            # doc-link 내부에서 <a> 태그 찾기
            a_tag = doc_link.find('a', href=True)
            
            if a_tag:
                href = a_tag['href']
                cols.append(href)
                print(cols)
            else:
                cols.append("")
                print("/****************************************************doc-link 내부에서 <a> 태그를 찾을 수 없습니다.")
        else:
            cols.append("url")
            print("class='doc-link'를 찾을 수 없습니다.")
        table_l.append(cols)
else:
    print("테이블을 찾을 수 없습니다.")
    
df_lists = pd.DataFrame(table_l[1:], columns=table_l[0])
df_lists

 

최종적으로 아래와 같이 한 종목의 공시 리스트를 확인할 수 있습니다

3. 공시 데이터 파일 받아오기

import requests
import pdfplumber

file_url = f"https://www1.hkexnews.hk/{df_lists.loc[0,'url']}"


# PDF 파일 다운로드
response = requests.get(file_url, headers=headers)
with open("downloaded_file.pdf", "wb") as pdf_file:
    pdf_file.write(response.content)

# PDF 파일에서 텍스트 추출
with pdfplumber.open("downloaded_file.pdf") as pdf:
    text = ""
    for page in pdf.pages:
        text += page.extract_text()

# 추출된 텍스트 출력 또는 다른 용도로 사용
print(text)

 

지난 미국 공시 수집과의 차이점으로는 

홍콩의 경우 html 파일로 제공하는것이 아닌

PDF 파일로 제공해주기에 pdfplumber 패키지를 활용해 텍스트를 추출했습니다!

 

그 결과!!

https://www1.hkexnews.hk/listedco/listconews/sehk/2023/1124/2023112400490.pdf

의 공시 데이터를 파이썬에서 잘 크롤링해옴을 알 수 있습니다.

 


지금까지 알아본 방식을 요약하면

홍콩 주식의 티커 데이터로

해당 종목의 공시 리스트 및 공시 세부정보 파악

을 진행하는 것 이었습니다!!^^

 

728x90

댓글