네이버에서 상당히 많은 국가의 주식 정보를 얻을 수 있다는 것을 알았으나,

좀 더 많은 국가의 정보를 수집하고 능력을 키우고 싶어서,

인베스팅닷컴에서 종목 정보를 수집을 시도해 봤다.

 

다음 URL에서 베트남 종목 목록 수집하는 것을 출발점으로 잡았다.

(https://www.investing.com/equities/vietnam)

 

해당 페이지는 기본적으로 'HNX 30'에 포함된 종목만을 보여준다.

모든 종목의 목록을 얻고 싶다면, 선택 상자에서 'Vietnam all stocks' 항목을 선택해야 하는 데, 이것을 프로그래밍적으로 자동으로 수행하도록 구현하는 방법을 찾느라 한참 헤맸다.

 

시행착오를 거듭한 결과, Go언어 기준으로 chromedp(https://github.com/chromedp/chromedp) 라는 모듈을 이용해서 다음과 같이 하면 모든 종목의 식별 데이터가 포함된 HTML을 추출할 수 있다.

// create chrome instance
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()

// create a timeout
ctx, cancel = context.WithTimeout(ctx, lib.P1분)
defer cancel()

const url = `https://www.investing.com/equities/vietnam`

var html string

if 에러 := chromedp.Run(ctx,
   chromedp.Navigate(url),
   chromedp.SetAttributeValue(`#all`, "value", "ALL"),
   chromedp.SetValue(`//select[@id="stocksFilter"]`, "ALL", chromedp.BySearch),      
   chromedp.WaitVisible("cross_rate_markets_stocks_1", chromedp.ByID),
   chromedp.InnerHTML("marketInnerContent", &html, chromedp.ByID),
); 에러 != nil {
   log.Fatal(에러)
}

이렇게 추출해 낸 HTML을 GoQuery(https://github.com/PuerkitoBio/goquery)등의 모듈을 이용해서 내용을 분석하면, pare_id(인베스팅닷컴 독자적인 일종의 종목 구분 코드), 종목 이름, 추가 정보 URL등의 정보를 추출할 수 있다.

 

문서 := lib.F확인2(goquery.NewDocumentFromReader(strings.NewReader(html)))
문서.Find("tbody tr").Each(func(i int, s *goquery.Selection) {
    pair_id, _ := s.Attr("id")
    href, _ := s.Find("a").Attr("href")

    <... 중략 ...>    
})

 

여기서부터 문제가 시작되는 데, 인베스팅닷컴에서 사용하는 종목 구분 코드인 Pair ID는 인베스팅닷컴 사이트 내에서만 의미가 있고, 다른 곳에서는 통하지 않는다.

Pair ID와 연결된 범용적인 '종목 코드(ticker, symbol)'을 알아내려면 모든 종목에 대해서 추가 정보 URL을 일일이 질의해야 한다.

즉, 인베스팅닷컴은 전세계 주식 종목에 대한 정보를 가장 광범위하게 제공하지만, 대신에 인베스팅닷컴 고유의 독자적인분류 코드로만 제공해서 범용성이 떨어지고, 일반적으로 사용되는 종목 코드로 변환하려면, 상당히 많은 추가 웹 질의를 해야한다.

 

이러한 범용성 문제가 없는 '야후! 금융'의 경우 제공하는 종목의 범위가 훨씬 좁은 문제가 있다.

광범위한 정보를 쉽게 수집하는 방법은 아직 못 찾았고, 편리성과 광범위함은 트레이드오프 선택 관계에 있는 것 같다.