2013년 7월 22일 월요일

시장 반응 속도에서 배운점

투자는 수익이 나야 재미있습니다. 수익이 나지 않으면 재미가 반감됩니다. 수익이 난다는 것은 돈을 번다는 것을 넘어서서 큰 성취감을 얻을 수 있다는 점에서 재미가 배가 됩니다. 조사한 자료들을 조합해 가설을 세우고 이를 투자 아이디어로 연결해 실제 투자에 돌입합니다. 투자이이디어가 시장에서 증명되면 짜릿한 쾌감마저 느낄 수 있습니다. 그게 투자를 놓을 수 없는 가장 큰 매력 아닌가 생각됩니다.

투자 아이디어는 아주 빠르게 시장에서 증명되기도 하고 다소 시간이 걸리기도 합니다. 또 그 아이디어가 증명되지 않을 때도 있습니다. 제가 겪은 몇 가지 사례를 소개하며 시장에서 깨지면서 배운점을 기록으로 남겨두려 합니다.

시장 예측을 잘못한 경우 - 동일금속


동일금속의 경우 높은 제품 품질과 가격 경쟁력을 무기로 나름의 해자가 있는 기업이라 생각하고 선택했습니다.

최근까지 동일금속은 괜찮은 수익을 안겨줬습니다. 올해도 남미와 호주의 자원 개발, 중국 경기 하강 진정 국면으로의 예상과 히타치로의 매출 증가를 기대했습니다.

나름대로 예상 EPS를 보수적으로 잡았음에도 주가가 현저하게 저평가 돼 있다는 판단이 들어 15,000원 부근에서 수량을 대폭 늘리는 피라미딩을 감행했습니다. 이 가격대도 안전마진이 35%이상 확보된 수준의 저렴한 가격이라 판단했습니다.

문제는 2013년 5월 30일에 발생했습니다. 동일금속의 2013년 1분기 실적이 발표된 날 입니다. 매출과 영업이익, 당기순이익 모두 제가 예측한 예측치는 물론이고 시장 컨센서스에 한참 못 미치는 수준이었습니다. 매출은 전년 동기 대비 역성장 하였고, 영업이익은 전년동기대비 66%가량 폭락한 19.8억원을 달성했다고 공시했습니다.

설상가상으로 주식 담당자는 전화 연결도 힘들고 아니나 다를까 다른 투자자들도 전화 연결이 힘들다고 아우성이었습니다. 시장에서는 제품 품질에 문제가 생겨 납기를 맞추지 못해 실적이 안 좋았다는 루머까지 돌았습니다.

1분기 실적 공시 이후 주가는 한달간 15,000원에서 10,600원까지 곤두박질 칩니다.

중국 굴삭기 시장 침체에 대해 다시 한번 생각해 보았습니다. 제가 시장을 잘못 읽었음을 인정하고 보유 수량의 60%를 손절매 하였습니다.

회사에 배신 당한 기분이 들었지만 나머지 40%를 남겨 둔 것은 '그래도 혹시 일시적 실적 악화이지 않을까' 싶어서 입니다. 조금은 동일금속의 저력을 더 믿어보고 싶습니다.

시장 예측이 1년 정도 빨랐던 경우 - 종근당


동 종목은 재무 스크리닝을 하면서 발견한 종목입니다. 고령화 트렌드에 부합하는 고혈압 약 매출이 높았고 여러 투자 지표가 제 마음에 쏙 들어 한 동안 애지중지 한 종목입니다. 

2011년 중반 25,000원 정도 가격에서 신규 진입을 시작했습니다. 첫 매입 당시 이 종목의 내재가치를 주당 4만원 이상 봤기 때문에 매수 후 홀딩 전략을 취했고 한 동안은 괜찮았습니다.

주가가 33,000원을 향해 달릴 때 까지 피라미딩을 해서  평단가를 아주 조금씩 높이며 수량을 소량씩 늘려나갔습니다.

2011년 8월, 제약 회사들이 가진 가장 큰 리스크 중 하나가 터져 현실이 되었습니다. 정부가 2012년 1월 부터 3월 까지 3개월간 약가인하를 하겠다고 발표했고 동사를 포함한 대부분의 제네릭 의약품 제조사의 약가가 절반가 수준으로 인하될 것이라고 했습니다. 고혈압약 딜라트렌 등 동사의 주력 제품들도 20%이상의 약가인하가 예고돼 수 백억원의 매출 손실이 불가피하게 된 상황이였습니다.

시장은 바로 반응했습니다. 이듬해 제약사들의 실적이 반토막 날 것이라는 공포에 8월 16일 하루 동안에만 주가가 11.96%주저 앉았습니다. 35,000원을 향해 가던 주가는 8월이 끝나기도 전에 곧장 21,000원대로 추락했습니다.

제 계좌도 빨간불에서 파란불을 켰고 손 쓸틈도 없이 손실이 누적되었습니다.

손절매와 비중확대 중 하나를 택해야 했습니다. 깊은 생각과 함께 회사 분석에 다시 들어갔습니다.

영업 환경을 분석해 본 결과 천안 공장의 가동률이 100%를 넘었고, 주식 담당자의 목소리에서도 힘이 넘쳤습니다.

재무 분석 결과도 좋았습니다. 이듬해 당기순이익이 반토막 난다는 가정하에 약가인하 상황을 최대한 보수적으로 잡아 앞으로 3년치 밸류에이션을 해도 이 회사의 주당 내재가치는 30,000원 이상이었습니다.

브랜드 가치와 오랜 업력을 생각 했을때도 쉽게 망하지는 않을 회사라는 판단이 들었습니다.

손절매는 하지 않고 평단가를 낮추기로 결정했습니다. 23,000원으로 가격이 떨어질 때 부터 스케일 트레이딩 일명 '물타기'를 시작했습니다. 금방 회복할 줄 알았던 주가는 잠시 반등을 주는가 싶더니 18,000, 16,000.. 13,000원대 까지 슬금슬금 떨어졌습니다. 하락 트렌드의 기간은 무려 1년 이었습니다.

그 동안 포트폴리오 관리에 실패해 제 포트폴리오 균형은 무너졌고, 종근당이 전체 포트폴리오의 30~40% 수준까지 차지하게 되는 초보적인 비극을 겪게됩니다. 반등을 주기까지 1년간 견디는 시간이 고통스러웠습니다.

다행이었던 점은 이 기업의 가치를 믿고 끝(?)까지 매수 후 보유(buy & hold)전략을 취한 것인데. 시장은 저 보다 1년 정도 늦기는 했지만 좋은 기업의 주가를 원상회복 시켜두었고 심지어 2012년 6월 시작된 상승 트렌드는 이 글을 쓰는 2013년 지금까지 6만원을 돌파하는 기염을 토해냅니다. 2012년 1분기 약가인하로 인한 손실폭이 18~22%정도로 발표됐는데 시장 예측치 보다 손실이 적다는 것이 주가 턴 어라운드의 이유 였습니다.

시장 예측이 곧바로 맞아 떨어진 경우 - 위닉스


위닉스는 생활속에서 발견한 간단한 호기심 덕분에 찾아낸 종목입니다. 제습기는 여름에 필요한 제품이라는 제 상식이 깨진 일이 있었습니다. 한 겨울이었죠. 집에 결로가 많이 생겨 저는 골머리를 앓고 있었습니다. 곰팡이가 생기면 아기 건강에도 안 좋으니까 더 걱정이었습니다.

그러다 생각해 낸 것이 제습기였습니다. 이런저런 정보를 수집한 끝에 한 겨울에 제습기를 구매했습니다. 과연 제습기를 틀어놓으니 공기도 따뜻해지고 습기도 쫙 빨려들어가는 등 좋은 점이 많았습니다.

곧장 이 실생활 속 아이디어를 투자로 연결했습니다. 제습기는 한 시즌 장사가 아니라 1년 내내 하는 장사라는 걸 깨달았기 때문입니다. 게다가 우리나라 기후가 아열대 기후로 바뀌는 건 이제 모두 이견없이 공감하는 부분인데, 아열대 기후로 바뀌면 여름철에 제습기 판매량은 더 늘어날 것이라고 생각했습니다.

장고 끝에 2013년 봄에 4,100원 ~ 4,400원 사이 단가로 위닉스에 최초 진입하였습니다. 
삼성전자나 LG전자는 제습기를 아무리 잘 팔아봐야 회사 전체 매출에 얼마 기여하지 못 할거라는 생각이 들었고 아무래도 규모가 작은 위닉스가 성장성이 높아 보였습니다. 

운이 좋게도 기관 주도로 시장이 동사에 관심을 가져줘서 올 여름 주가는 10,000원을 돌파했습니다.

우연히 얻어 걸린 경우 - 동양이엔피


동양이엔피의 경우 B2B회사이기 때문에 제가 이 회사를 BM이나 생활 속에서 발굴하는 것은 거의 불가능에 가깝습니다. 재무제표 스크리닝을 하다가 회사를 하나씩 솎아내던 중 발굴한 회사입니다.

SMPS라고 하는 부품을 만드는 회사인데, 전자 제품에 들어가는 전력과 관련된 장치입니다. 이 부품이 전력 공급을 불안정하게 하면 전자제품이 망가지기 때문에 높은 기술력을 요하는 분야 입니다.

국내 시장 점유율이 꽤 높았고 낮은 영업이익률을 제외한 거의 모든 투자 지표가 완벽했습니다. BM은 주로 대기업 전자 회사에 제품을 납품하는 것으로 성립이 됐는데, 높은 기술력과 영업력이 이를 뒷받침 해주고 있었습니다.

제품 완성단계에서 납품되는 부품이라 납품 리스크도 적어보였습니다. 당시 제가 발견했을 때는 1년 예상 EPS기준 PER이 3 수준이었고, FCF도 꾸준히 늘어나고 있었습니다.

내재가치가 높아서 안전마진도 높은 수준이었습니다. 주당 3만원 이상의 내재가치를 가진 주식이라고 보고 운 좋게도 10,000 ~ 11,000원 수준에서 매입을 시작했습니다.

초기 매입을 시작 할 때 부터 동사 주가는 가파르게 상승을 시작했습니다.

재미있게도 주가의 상승 이유는 제가 바라 본 투자아이디어와 전혀 딴판의 이슈 때문이었는데, 하나는 '스마트폰' 판매량 증가에 따른 동사 SMPS매출 증대 기대감 때문이었고 다른 하나의 이유는 삼성전자의 갤럭시 스마트폰에 무선 충전기가 탑재된다는 기대감 때문이었습니다. (동사는 무선 충전기도 제조합니다.)

제가 전혀 예상치 못했던 이슈들로 주가가 오르니 기분은 좋았는데, 시장은 이렇듯 저보다 훨씬 디테일하고 똑똑하다는 점을 다시 가르쳐줬던 종목이었습니다.

방향은 맞췄지만 이유는 예상치 못했으니 돈은 벌었어도 50점 짜리 투자에 불과한 경험이었습니다.

주가는 24,000원을 찍고 급락하고 있습니다. 이유는 갤럭시S4 판매 부진 때문인데, 주가가 오를때는 당연히 스마트폰 때문에 올랐지만 스마트폰 이슈를 생각하지 않아도 매출처가 워낙 다변화 돼 있는데다 내재가치가 높아 최근 주가 하락은 과도한 측면이 있지 않나 생각하고 있습니다.

공통점


위 투자 사례들은 자랑하려고 쓴 사례가 아닙니다. 사실은 동양이엔피를 제외하면 투자 실패 사례에 가깝습니다.

손실 중 일때는 회사를 믿는답시고 장기투자를 했습니다. 일명 '강제장투'라고 하죠. 그리고 주가가 본전을 찾으면서 재빠르게 매도를 사작했습니다. 개미투자자의 전형적인 패턴을 제가 보이고 만 것 입니다. 

위에 소개드린 종목들은 단기간에 2루타를 친 종목도 있고 심지어 1년만에 3~4루타를 친 종목도 있습니다.

그러나 저는 저 종목들로 0.5루타도 달성하지 못했습니다. 이유는 뭘까요?

'인내와 믿음'이 부족했기 때문입니다. 회사에 대한 인내와 믿음이 아닙니다. 회사가 저에게 주식 사라 팔아라 한 적도 없고 위 회사 전부 임직원분들 모두가 정말 열심히 일하는 회사입니다. 

문제는 제 자신을 믿지 못했다는 것 입니다. 비슷한 이유로 투자 경력 7년만에 올해는 손절매라는 것도 꽤 많이 했습니다. 

나름의 무손절 100%이익 실현 신화가 깨진해 입니다. 2년 넘게 들고 있던 계양전기는 2,200원대에 손절매를 했더니 3,000원 가까이 치솟았습니다. 

익절을 했지만 몇 해전에도 미창석유를 45,000원대에 들고 있었는데 몇 년간 지지부진한 주가흐름에 백기를 들고 투항한 적이 있습니다. 제가 백기를 들자마자 주가는 90,000원까지 올랐습니다.

앞으로는 제 자신을 믿어보기로 했습니다. 한 기업을 매수하기 전에 최소 한달에서 세달 이상은 꼼꼼히 공부합니다. 그 이후엔 몇 년이고 주가 추이를 살피고 기업 정보를 누적합니다. 그렇게 믿고서 매수한 종목에 대한 믿음을 쉽게 잃어버릴 필요는 없다는 점을 배웠습니다. 스스로 납득할만한 상식에 근거해 투자한다면 요동치는 주가 따위는 잊어버리기로 했습니다. 

비 온 뒤에 땅이 굳는다 했는데 제 자신에 대한 믿음도 더 단단히 굳는 한 해가 됐으면 합니다. 글 읽으시는 분들 모두 성공 투자 하시길 빕니다. 

2013년 7월 22일
송종식 드림

2013년 7월 11일 목요일

삼화페인트, 수출포장, TJ미디어, 동양이엔피, 금화피에스시

안녕하세요. 오랜만에 개별 종목 관련해서 글을 쓰네요. 요즘 장세가 장세인지라 개별 종목 글을 언급하기에는 다소 조심스럽습니다.

개인적으로 분석중인 종목도 많고, 분석을 끝낸 종목도 많은데 이를 글로 옮겨 블로그에 소개 드리려고 하니 시간이 많이 들어가네요. 요즘 너무 바빠 정밀 분석 자료들을 블로그에 글로 옮길 시간이 없어서 관심 종목 몇 가지를 간략하게 소개드리려고 합니다.

수출포장 (002200)


간략 소개 : 골판지 상자 제조 업체
투자아이디어 1 : 코스피 최고의 우량한 재무구조
투자아이디어 2 : 온라인 쇼핑몰 활성화에 따른 수혜
투자아이디어 3: 코스피 최고의 저평가 종목
리스크 : 폐지와 고지, 펄프 시세가 오르면 이익률이 급감
2013년 초 계산한 내재가치 밴드 : 48,000원 ~ 63,000원

삼화페인트 (000390)


간략 소개 : 페인트 제조/유통 업체
투자아이디어 1 : 베트남, 필리핀, 태국 등 동남아 신흥국 적극 진출
투자아이디어 2 : 스마트폰 도료 산업 진출, 업계 1위
투자아이디어 3 : 건설 경기 바닥론(?)
투자아이디어 4 : DIY족의 급증
리스크 또는 초대형 호재 : 경영권 분쟁
2013년 초 계산한 내재가치 밴드 : 7,900원 ~ 11,500원

동양이엔피 (079960)


간략 소개 : SMPS, 충전기 생산 업체
투자아이디어 1 : 거의 모든 전자 제품에 들어가는 필수 부품 SMPS
투자아이디어 2 : 제품 완성 단계에 필요하므로 납품 리스크가 적음
투자아이디어 3 : 우량한 재무구조와 저평가 된 주가
리스크 : 대기업 납품 리스크, IT 전방 산업 위축
2013년 초 계산한 내재가치 밴드 : 26,000원 ~ 38,000원

금화피에스시 (036190)


간략 소개 : 발전 설비 플랜트 전문 기업
투자아이디어 1 : 기술 전문 기업으로 재고가 없음
투자아이디어 2 : 공기업 물량이 민간으로 이관 중
투자아이디어 3 : 정부는 2027년까지 70조원을 발전 설비에 투자할 예정
투자아이디어 4 : 이 중, 48조원은 2017년까지 투자
투자아이디어 5 : 우량한 재무구조
투자아이디어 6 : 높은 기술력
리스크 : 정부 투자 철회, 수주 리스크, 대체 에너지 발견
2013년 초 계산한 내재가치 밴드 : 42,000원 ~ 45,000원

TJ미디어 (032540)


간략 소개 : 노래방 기기 제조, 음원 유통
투자아이디어 1 : 국내 시장에서 꾸준한 음원 매출
투자아이디어 2 : 일본 시장에서 꾸준한 노래 음원집 매출
투자아이디어 3 : 한류로 인한 태국, 필리핀 동남아 매출 급성장
투자아이디어 4 : 한류로 인해 심지어 미국 시장에서도 인기 예감
투자아이디어 5 : 괜찮은 배당
리스크 : 한류 열풍 추이, 높은 시장 경쟁, 다른 놀이 문화의 인기
2013년 초 계산한 내재가치 밴드 : 4,500원 ~ 5,000원

2013년 7월 11일
송종식 드림

* 출처를 표기해 주신다면 얼마든지 퍼가셔도 좋습니다. 단, 상업적 이용은 불가능 합니다.

위험성 안내 : 이 글은 매수와 매도를 추천하는 글이 아니며 개인적 학습 내용을 공유하기 위한 참고적 용도의 글입니다. 또한, 이 글은 법적 증빙 자료로 활용될 수 없음을 고지드립니다.

2013년 7월 10일 수요일

Helloween - Dr.Stein (cover version by 송종식)



원곡 밴드 : Helloween (독일)
커버 보컬 : 송종식
장르 : 멜로딕 스피드 메탈

어려운 곡 입니다. 너무 유명한 헬로윈의 명곡이죠.
공연 실황입니다(ㅋㅋ). 제가 좀 신나게 망쳐봤습니다~

[가사]

Once they killed his monster when it went into a trap
now he's making better ones on a higher step

On a warm summer day the doctor went away
to a place where he could make it real
his assistant's hips were nice
so he cloned her once or twice
now his hips are aching what a deal

Dr. Stein grows funny creatures
let's them run into the night
they become great rock musicians
and their time is right

Sometimes when he's feeling bored
he's calling it a day
he's got his computer and they do it their own way

They mix some DNA, some skin and certain spray
you can watch it on a laser screen
and the fellow's blue and gray
or sometimes pink and green

just check it out on halloween (.. 이하 fade out .. )

2013년 7월 7일 일요일

PHP, 스누피 클래스를 이용해서 현재 주가 긁어오기

PHP로 작성된 강력한 외부 소켓 클래스인 스누피(Snoopy)클래스를 이용하면 웹사이트 내용을 쉽게 크롤링 해 올 수 있습니다. 제 경우에는 투자를 위해서 스누피 클래스를 사용하고 있습니다. 현재 주가를 실시간으로 긁어와서 제가 생각하는 목표 가격대와 괴리율이 얼마인지 한눈에 볼 수 있어서 편리합니다. 또 각 포털사이트와 신문사의 기사 중 관심 키워드가 포함된 신문 기사도 실시간으로 긁어와서 구독하고 있기 때문에 편리합니다.


스누피 클래스를 응용하는 방법은 많겠지만 오늘은 포털 사이트 다음에서 제공하는 실시간 주가를 크롤링해서 가져오는 방법을 간단하게 소개 드리겠습니다.

스누피 클래스 설치


스누피 클래스는 따로 설치할 필요없이 다운로드만 받아 프로젝트 내에 복사하면 됩니다. 스누피 클래스를 다운로드 받을 수 있는 주소는 다음과 같습니다.

다운로드 : http://sourceforge.net/projects/snoopy/files/latest/download

다운로드를 받고 나서 압축을 풀면 Snoopy-1.2.4라는 폴더가 생깁니다. 이전 1.2.3버전에서는 구문 오류가 몇 군데 있었던 것 같은데 이번 버전에서는 고쳐진 것 같네요. Snoopy-1.2.4 디렉토리를 열어보면 아래와 같은 파일들이 있습니다.


스누피 클래스가 지원하는 기능이나 사용법에 대해서 궁금하신 부분이 있으면 README 파일을 읽어보시면 됩니다. 가장 핵심적인 파일은 Snoopy.class.php 파일 입니다. 저 파일을 우리가 만들고자 하는 프로젝트 내에 위치시키면 바로 사용할 수 있는 준비가 됩니다. 설치라고 할 것도 없네요. 이것으로 스누피 클래스가 준비되었습니다.

페이지 크롤링 테스트(네이버 메인 페이지 긁어오기)


그럼 스누피 클래스를 이용해서 웹페이지 하나를 테스트로 크롤링 해 보겠습니다. 일단 test.php 파일을 하나 생성해서 HTML의 <body>태그안에 다음과 같은 코드를 작성해 보았습니다.
include_once 'Snoopy.class.php';
$snoopy = new snoopy;
$snoopy->fetch("http://www.naver.com");
$txt = $snoopy->results;
print_r($txt);
구글 블로그에서 Syntax Highligher를 쓰니 일부 구문이 깨지거나 왜곡 되네요. 감안하여 코드를 읽어주시면 감사 드리겠습니다.

스누피 클래스를 현재 프로젝트에 인클루드 하여(이 예제의 경우 스누피 클래스 파일이 동일한 폴더내에 있다고 가정), $snoopy에 새 객체를 만들어서 담았습니다. fetch 구문을 이용해서 네이버의 메인페이지를 모두 긁어오라고 구문 한 줄을 추가했고, 긁어온 구문은 $txt변수에 담아서 이를 print_r 해서 화면에 뿌려주는 간단한 구문입니다.

정말 너무너무 간단하고 강력합니다. 아래는 위 구문을 실행해서 네이버 메인페이지를 크롤링해서 긁어온 결과입니다. (스타일 시트는 당연히 안 긁어옵니다.)


너무너무 쉽고 간단하게 네이버 메인 페이지의 내용들을 크롤링 해 왔습니다. 정말 쉽고 강력합니다.

원하는 부분만 가져오기 (주가만 긁어오기)


웹페이지 전체를 긁어오지 않고 원하는 부분만 가져올 수 없을까요? 당연히 그것도 가능합니다. 아래 화면은 포털 사이트 다음에서 제공하는 주식 종목 정보 페이지 입니다.


'수출포장'이라는 종목 정보 페이지입니다. 이 종목 페이지 내용을 전부 긁어오고 싶은게 아니라, 현재가만 가져오려고 합니다. 그러려면 먼저 이 페이지의 URL을 알아야겠습니다.

다음 증권 종목 페이지 주소 : 
http://stock.daum.net/item/main.daum?code=002200

주소에서 가장 마지막 숫자 6자리는 종목코드입니다. 이 예제에서는 종목코드 '002200'번  즉, 수출포장 종목의 시세를 가져오도록 하겠습니다.

현재가 부분을 가져 오려면 HTML DOM 구조를 파악해야 합니다. 해당 페이지 소스 보기를 하거나 개발자 도구를 이용해서 현재가 부분의 마크업을 살펴보도록 하겠습니다.


우리가 가져 올 현재가는 <em class="curPrice up"></em> 이라는 방법으로 마크업이 돼 있네요. 보니까 시세는 curePrice라는 클래스를 사용하는 것 같고, 뒤에 up, down 으로 하락인지, 상승인지, 보합인지 색상을 입혀주는 클래스가 추가로 적용돼 있는 것 같습니다.

그럼 정규식을 이용해서 저런 마크업을 찾아 저기 있는 숫자만 빼내 오도록 하겠습니다. 참, 동일한 페이지 내에서 동일한 마크업을 사용하는 부분이 다른 곳에도 있다면 크롤링이 여러번 되므로 저렇게 마크업 한게 저 부분 뿐인지 꼭 확인해야 합니다.
include_once 'Snoopy.class.php';
$snoopy=new snoopy;
$o="";
$snoopy->fetch("http://stock.daum.net/item/main.daum?code=002200");
$txt=$snoopy->results;
$rex="/\<em class=\"curPrice.+\"\>(.*)\<\/em\>/";
preg_match_all($rex,$txt,$o);
print_r($o[0][0]);
아까 네이버 메인 페이지 전체를 긁어온 코드를 조금 수정했습니다. fetch는 다음 증권 페이지 수출포장 종목을 바라 보도록 했습니다.

그리고 $rex 변수에 담기는 정규식을 잘 봐주세요. <em>태그에 curePrice라는 클래스를 가지고 있는 부분을 찾는 구문입니다. <em>~</em>태그 사이에 숫자만 뽑아와 $rex 변수에 담았습니다.

그리고 PHP의 정규 함수인 preg_match_all 함수에 이를 담아 정규식을 해석하고 print_r로 가져 온 가격 정보를 화면에 뿌려주는 간단한 코드입니다. 이 코드를 실행한 결과는 아래 화면과 같습니다.


정규식으로 추출한 <em>태그가 잘 크롤링 돼 가져와 졌음을 확인할 수 있습니다. 이런식으로 스누피 클래스를 응용하면 다양한 벙법으로 나만의 편리한 도구를 만들어서 사용할 수 있습니다.

만약 DB에 종목 모드 정보를 넣어 놓고 동적으로 종목별 가격 정보를 얻어 오고 싶다면 다음과 같이 코딩하면 됩니다.

먼저 아래와 같은 코드를 작성해서 DB에 연결을 해야겠죠.
// DB 연결
$connect = mysql_connect("localhost","root","root") or die("DB에 연결할 수 없습니다.<br>");
mysql_query('set names utf8');
mysql_select_db("stocks",$connect);

// 종목 목록 가져오기
$query="SELECT*FROM list";
$result=mysql_query($query,$connect);
DB연결에 성공하고 종목 목록 정보를 가져 왔다면 while 문을 이용해서 종목 개수 즉, DB의 row 개수 만큼 반복을 돌립니다.
while ($row=mysql_fetch_array($result)) {
  // 여기에 크롤러와 크롤러에서 가져 온 마크업 정보를 뿌려주면 되겠죠.
}
그리고 while 문 안에,
include_once 'Snoopy.class.php';
$snoopy=new snoopy;
$o="";
$snoopy->fetch("http://stock.daum.net/item/main.daum?code=".$row[s_code]);
$txt=$snoopy->results;
$rex="/\<em class=\"curPrice.+\"\>(.*)\<\/em\>/";
preg_match_all($rex,$txt,$o);

<tr>
 <th>현재가</th>
 <td><? print_r($o[0][0]); ?></td>
</tr>
이와 같은 식으로 코드가 들어가면 됩니다. snoopy 객체 fetch 하는 부분에서 다음 증권 URL 마지막 숫자 6자리는 종목 코드라고 했습니다. 위 예시 코드에서는 DB에서 종목코드를 저장할 때 필드명을 's_code'로 지정했기 때문에 .$row[s_code] 라고 받아오면 동적으로 처리가 가능합니다.

그리고 루프를 돌면서 <tr>태그를 한 줄씩 뿌려가며 가격 정보를 보여주겠죠. 간단하지만 강력한 스누피 클래스를 이용한 크롤링 방법에 대해서 알아보았습니다.

크롤링 시 주의 사항


이미 잘 알고 계시는 독자분들도 많으시겠지만, 크롤링을 할 때는 몇 가지 주의해야 할 사항들이 있습니다.

  • 웹페이지의 디자인이 바뀌어 마크업 DOM구조가 바뀌면 크롤러 코드도 바꿔줘야 합니다. 혹시 크롤러가 제대로 페이지 내용을 크롤링 해오지 못하면 가장 먼저 긁어 올 대상 웹페이지의 디자인이 바뀌지 않았는지를 체크해야 합니다.
  • 스크립트를 이용해서 크롤러가 매일 같은 시간에 지속적으로 대량의 트래픽을 발생시켜 크롤링을 한다면 내 서버쪽 IP가 차단돼 해당 사이트에 접속이 안 될수도 있습니다. 당연히 크롤링도 안되겠죠. 불규칙적 비정기적, 다양한 IP로 크롤링 하는 것이 편법이기는 하지만 안전합니다.
  • 아예 서버에서 외부 크롤링을 막는 경우도 있으니 크롤링 하기 전 간단하게 테스트를 해봐야 합니다.

스누피 클래스


스누피클래스는 크롤러 이외에도 소켓 통신을 위한 다양한 기능을 지원하는데 이 부분에 대해서는 추후 시간이 나면 다시 설명드릴 수 있도록 하겠습니다. 간단한 프로그래밍으로 투자 효율을 높이시기 바랍니다.

2013년 7월 7일
송종식 드림