2023.11.27 - [일등박사의 생각/데이터분석] - 홍콩주식 공시 확인하기!! (feat. 텐센트 배당공시 확인하기)
2023.11.28 - [일등박사의 생각/데이터분석] - 미국주식 공시 확인하기!! (feat. 애플 배당공시 확인하기)
2023.11.29 - [일등박사의 생각/데이터분석] - 미국 주식 공시 Edgar 크롤링하기 (w. python)
기존 포스팅에 이어 이번에는 홍콩 주식의 공시정보를
크롤링하는 방법을 알아보겠습니다!
홍콩주식의 경우 hkex 사이트에 공시가 공지됩니다!!
https://www1.hkexnews.hk/search/titlesearch.xhtml?lang=en
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
의 공시 데이터를 파이썬에서 잘 크롤링해옴을 알 수 있습니다.
지금까지 알아본 방식을 요약하면
홍콩 주식의 티커 데이터로
해당 종목의 공시 리스트 및 공시 세부정보 파악
을 진행하는 것 이었습니다!!^^
'데이터&AI > 금융데이터' 카테고리의 다른 글
Dart에서 기업 사업보고서 공시 수집하기 (feat .Python) (1) | 2024.02.05 |
---|---|
Dart API KEY 발급받기 (open dart. dart api key) (0) | 2024.02.04 |
미국 주식 공시 Edgar 크롤링하기 (w. python) (0) | 2023.11.29 |
미국주식 공시 확인하기!! (feat. 애플 배당공시 확인하기) (0) | 2023.11.28 |
홍콩주식 공시 확인하기!! (feat. 텐센트 배당공시 확인하기) (1) | 2023.11.27 |
댓글