Post List

2018년 5월 18일 금요일

구글 스프레드시트에서 크롤링 하는법




굳이 프로그래밍을 하지 않아도
구글 스프레드시트에서 매우 편리하게
크롤링 기능을 사용할 수 있습니다.



먼저 comp.fnguide.com 에 접속하여
사이트 주소가 어떻게 구성되어 있는지 확인해봅니다.

재무제표 탭을 클릭하여 봅니다.




가운데 6자리 종목코드만 변경하면 되도록
링크가 구성되어 있습니다.

http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode=A005930&cID=&MenuYn=Y&ReportGB=&NewMenuID=103&stkGb=701

따라서 향후에 종목코드만 변경되면
크롤링 정보가 알아서 변경되도록 구성합니다.

B2 셀에 티커를 입력한 후,
링크의 앞과 뒤 문자열을 CONCATENATE 함수를 이용해
합쳐주도록 합니다.


=CONCATENATE("http://comp.fnguide.com/SVO2/asp/SVD_Finance.asp?pGB=1&gicode=A",종목코드,"&cID=&MenuYn=Y&ReportGB=&NewMenuID=103&stkGb=701)")


005930 처럼 앞에 0을 입력할 경우 
0이 삭제되어 5930 으로 강제 변경이 됩니다.

이럴 경우 문자열 앞에 ' 을 입력하거나
서식 → 숫자 → 일반 텍스트
셀의 형식을 변경해주면 해결이 됩니다.








이번에는 가지고 오고자 하는 데이터의 Xpath를 확인해야 합니다.
예시로 매출액의 전년동기(%) 를 따오도록 합니다.
(어떤 데이터든지 가능합니다.)

가지고 오고자 하는 데이터에서 우클릭을 한후
검사를 눌러주도록 합니다.






크롬의 개발자도구 창이 열립니다.

개발자도구 코드들을 위아래로 움직이면
이에 해당하는 홈페이지 데이터가 무엇인지
왼쪽화면에서 해당 색깔이 변경되면서 확인이 가능합니다.

원하는 지점에 마우스를 댄 뒤
우클릭 → Copy → Copy Xpath를 클릭합니다.





스프레드시트에 붙여넣기를 하면
해당 숫자의 Xpath가 붙여넣어 집니다.

//*[@id="divSonikY"]/table/tbody/tr[1]/td[6]

다른 글자에서 동일하게 Xpath를 추출하면
다른 주소가 복사됩니다.





추출한 링크와 Xpath만 있으면 importxml 함수를 이용하여
해당 데이터를 스프레드시트로 끌고 올 수 있습니다.


=importxml(url, Xpath)

를 입력하면
해당 url의 Xpath 값 데이터를 가져옵니다.





이번에는 하나의 값이 아닌
테이블을 통째로 긁어오도록 하겠습니다.

테이블 끝 즈음에 마우스를 댄 후
역시나 우클릭 → 검사 를 통해
개발자 모드로 넘어갑니다.

적당히 위아래로 마우스를 옮기다 보면,
테이블 전체가 선택되는 지점이 있습니다.

해당 지점에서
우클릭 → Copy → Copy Xpath를 클릭합니다.






//*[@id="compBody"]/div[2]/div[2]/div[4]

가 선택됩니다.

미세한 위치 차이에 따라

//*[@id="divSonikY"]
//*[@id="divSonikY"]/table

가 복사되기도 하는데
어짜피 결과는 동일합니다.




위와 동일하게 importxml에 xpath를 변경하여 입력해 봅니다.





분명 크롤링이 되기는 되는데
문제가 발생합니다.

테이블 형식이 유지가 되지 않고,
글자를 통째로 긁어와 버립니다.




해당 문제를 해결하기 위해서
importhtml 함수를 사용합니다.

imortxml이 해당 url 중 특정 데이터를 가져오는데 편리하다면
importhtml은 url 중 테이블 째로 가져오기 편리한 함수입니다.


=importhtml(url, "table", 숫자) 를 통해
원하는 테이블을 긁어올 수 있습니다.

숫자는 1부터 계속 바꾸어가면
url 내 각각 다른 테이블이 불러와 집니다.






url 내 첫번째 테이블인 포괄손익 계산서 항목이
테이블 형태로 잘 긁어와지는게 보입니다.





이번에는 두번째 테이블을 긁어오기 위해 숫자를 2로 바꾸어 봅니다.
동일한 포괄손익 계산서에서 분기 기준 데이터가 불러와집니다.





3을 입력해 봅니다.
페이지에서 아래에 위치하는 재무상태표 테이블이
잘 불러와집니다.





4를 입력해 봅니다.
역시나 분기기준 재무상태표 테이블이 불러와 집니다.






5와 6을 입력하면 연간과 분기기준 현금흐름표가 불러와 집니다.






이번에는 종목 티커만 바꿔보도록 하겠습니다.
005930에서 068270 으로 변경하면

Link 가 자동으로 바뀌어
해당 종목의 재무데이터를 읽어오게 됩니다.



댓글 12개:

  1. 신기하네요. 컴퓨터 바보인데 자세히 설명해 주셔서 고맙습니다. Xpath 두 개를 붙여넣은 이유는 무엇인가요?

    답글삭제
  2. Fnguide에 아래 페이지를 importhtml이나 importxml로 가져오려고 하는데 imported content is empty 란 에러 메시지가 나옵니다. 혹시 방법이 잇을까요?
    http://comp.fnguide.com/SVO2/common/chartListPopup2.asp?oid=div5_img&cid=05_05&gicode=A005930

    답글삭제
    답글
    1. 해당 url은 데이터를 다른데서 불러오고 자바로 래핑한거라 html로는 못불러 옵니다.
      원데이터는 아래 url에 JSON 형태로 있고요
      http://comp.fnguide.com/SVO2/json/chart/05_05/A005930.json?_=1554335554363

      스프레드시트에서 JSON 땡겨오는 법은 다음과 같습니다.
      https://medium.com/@paulgambill/how-to-import-json-data-into-google-spreadsheets-in-less-than-5-minutes-a3fede1a014a

      삭제
    2. 지나가다가 너무 절실해서 질문드립니다. https://op.lol/zyra/?lane=support 해당 사이트의 자료들도 어디선가 받아오는 자료라서 같은 현상이 일어나는데 원데이터의 출처나 특징은 어떻게 알수 있나요?

      삭제
  3. 안녕하세요. 지나가다가 들립니다
    http://comp.fnguide.com/SVO2/asp/SVD_Consensus.asp?pGB=1&gicode=A003410&cID=&MenuYn=Y&ReportGB=&NewMenuID=108&stkGb=701

    컨센서스 란에서 table 긁으면 자꾸 비어있다고 나오는데 왜그러는지 알수 있을까요?

    답글삭제
  4. 정말 필요한 내용이였는데, 구글 스프레드시트로 이렇게 간단하게 할 수 있었네요..
    좋은 정보 감사합니다. 광고 센스것 누르고 가겠습니다.

    답글삭제
  5. 혹시 처음에는 잘 되다가, URL을 가지고 올 수 없다고 하는데, 링크는 수동으로 잘 열립니다.
    혹시 FN가이드 쪽에서 막은건가요??

    답글삭제
  6. 잘 읽었습니다.
    그런데 되는 사이트가 있고 안되는 사이트가 있나 봅니다.
    저는 Whoscored.com 의 순위 테이블을 가져 올려고 많은 노력을 기울여 봤으나 되지 않네요.
    가져 올 수 있는 방법이 없을까요?

    답글삭제
  7. 감사합니다. 너무 재미있네요

    답글삭제
  8. 해당 홈페이지에 있는 표들의 데이터를 스프레드 시트로 어떻게 가져올 수 있을까요? importhtml을 이용해 table로 가져오면 가져온 데이터가 비어있다고 뜹니다.
    https://www.shijou-nippo.metro.tokyo.lg.jp/SN/200505/20050502/Sei/SN_Sei_Tukiji_index.html

    위 사이트에서 추가 클릭을 하면 csv파일을 열 수 있는데, importdata로 csv파일을 갖고 오면, 언어가 깨져버립니다. 해결할 방법이 없을까요?

    답글삭제
  9. importhtable은 첨보네요 감사합니다

    답글삭제