본문으로 바로가기

웹 데이터 수집의 기술

category 내가 쓴 책들 2017.07.14 01:10

웹 데이터 수집의 기술



웹 데이터 수집의 기술 책에 나온 소스코드 입니다.



ex02-1 엑셀 vba로 네이버 검색결과 출력하기

https://gist.github.com/Kyeongrok/fed1833139fd46a6cfb3f73524a08844


엑셀 2013 미만일 때 소스코드

https://gist.github.com/Kyeongrok/748de3a0a54812512e8d0bc9f3606426



ex03-1 구글 앱스 스크립트로 데이터 추출하기

https://gist.github.com/Kyeongrok/eba4f2d931daa04b4f3e5f21d013a89d



동영상 강의

https://www.youtube.com/playlist?list=PLAdQRRy4vtQQit2nYYCWvIPbyLOtRpR8j



Chapter01.txt

Chapter02.txt

Chapter03.txt

1
2
3
4
5
6
7
8
9
10
11
function myFunction() {
var formattedDate = Utilities.formatDate(new Date(), "KST""yyyy-MM-dd HH:mm:ss");
 
// 시트에 읽어온 데이터 출력하기
var ss = SpreadsheetApp.openByUrl(
'https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit');
var sheet1=ss.getSheetByName("Sheet1");
sheet1.getRange(1,1).setValue("실행시간");     // 실행 시간이라고 출력
sheet1.getRange(1,2).setValue(formattedDate);  // 날짜 출력
}
 
cs


Chapter04.txt

Chapter05.txt

Chapter06.txt


function myFunction() {
  // 1. 새로 만든 구글 스프레드시트의 인터넷 주소(URL)를 지정
  var url = "https://docs.google.com/spreadsheets/d/1aRz9Jp5-LH-ocqPz03CgagYFns-rOE9MLp_-fHfBHTE/edit#gid=1721336146";
  var spredSheet = SpreadsheetApp.openByUrl(url);
  
  // 2. 날짜 생성하기
  var d = new Date();
  var targetName = Utilities.formatDate( d, 'GMT', 'yyyyMMdd');
  
  // 3. 원본/대상 시트 준비
  var baseSheet = spredSheet.getSheetByName("base");
  var targetSheet = createSheet(spredSheet, targetName, 0);

  var statement = '=IMPORTXML("http://www.r114.com/z/real/m_detail.asp?only=0&m_=5&g_=&type_m=m&addr1=%BC%AD%BF%EF%C6%AF%BA%B0%BD%C3&addr2=%B0%AD%B3%B2%B1%B8&addr3=%BF%AA%BB%EF%B5%BF&type_g=A&type_cd=03%5E05%5E&mpl=15000&mph=16000&SF_PKVal=6&SF_Size=0&sort=desc&order=%B8%C5%B8%C5%B0%A1&rNumber=5791&lst=ml&mkind=30&aptcode=G01011350800030&mulcode=30BB0F25607876&housingtype=77.77&areasize=00023&sizetype=D","//*[@id=\'wrap\']/div[5]/div[3]/div[1]/div[2]/div[3]/dl[1]/dd/span")';
  // 4. ImportFeed 함수 다시 실행
  baseSheet.getRange('a1:e1').setValue("");
  
  baseSheet.getRange(1,1).setFormula(statement);
  baseSheet.getRange(1,1).copyTo(baseSheet.getRange('A2'), {contentsOnly: true});
  baseSheet.getRange(1,1).setValue("가격");
  
  // 5. 받아온 값을 시트에 출력
  // 복사 대상 범위 설정(A1:B21)
  var rangeToCopy = baseSheet.getRange('a1:d10');
  
  // 복사 시작 셀 지정(A1)
  var targetToCopy = targetSheet.getRange('A1');
  rangeToCopy.copyTo(targetToCopy);
}

function createSheet(spredSheet, sheetName, index) {
  var sheet = spredSheet.getSheetByName(sheetName);
  if (sheet == null) {
    spredSheet.insertSheet(sheetName, index);
    sheet = spredSheet.getSheetByName(sheetName);
  }
return sheet;
}

https://gist.github.com/Kyeongrok/e964758e5249a0a271821feaf0c4c5f8



댓글을 달아 주세요

  1. 한철동 2017.09.29 19:49 신고

    이북으로 구입하여 일독하였습니다~. 강의장에서 뵙겠습니다.

  2. 김성현 2017.12.05 20:34 신고

    경록김 선생님 안녕하세요? 웹데이터수집의 기술 잘 보고 있습니다. 프로그램에 대해 초보라서 궁금한 점이 있어서요.

    46페이지: 네비어의 가장 첫 페이지를 스크래핑하고 싶으면 페이지주소 = "https://www.naver.com/"으로 써줍니다.

    페이지주소 = "https://www.naver.com" & 검색어

    이렇게 바꾸니 에러가 나와서요. 어떻게 수정해야 하나요?

  3. 김성현 2017.12.05 21:04 신고

    2-2 데이터를 가지고 올 페에지 주소 지정하기 (활용)


    저는 코리아타임즈 (http://www.koreatimes.co.kr) 홈페이지에서
    오영진칼럼 (키워드: Oh Young-jin)을 스크랩핑 하고 싶어요.

    그래서 예제코드를 다음과 같이 바꾸었어요.

    검색어 = WorksheetFunction.EncodeURL("Oh Young-jin")
    페이지주소 = "http://www.koreatimes.co.kr" & 검색어

    그런데 에러가 나오네요 ㅠㅠ

    어떻게 하면 원하는 값을 구할 수 있을까요?

  4. 김성현 2017.12.06 21:52 신고

    김경록 선생님, 바쁘신데 불구하고 답장 감사합니다.

    안내해주신 유튜브를 찬찬히 보았지만 아직 솔루션을 찾지 못했습니다.

    저는 코리아타임즈 (http://www.koreatimes.co.kr) 홈페이지에서
    오영진칼럼 (키워드: Oh Young-jin)을 스크랩핑 하고 싶어요.

    그래서 예제코드를 다음과 같이 바꾸었어요.

    검색어 = WorksheetFunction.EncodeURL("Oh Young-jin")
    페이지주소 = "http://www.koreatimes.co.kr" & 검색어

    제가 올려드린 방법에서 무엇을 고쳐야 하나요?

    혹시 제가 문의 드리는 부분이 도서외에 유료로 수업을 들어야 알 수 있는 내용인지, 그렇다면 어느 수업이나 도서를 공부해야 하는지 방향을 알려주시면 감사하겠습니다.

    김성현 드림

  5. Bluefox 2017.12.08 14:18 신고

    6-4장의 쇼핑몰 리뷰 데이터 수집하기가 다른 쇼핑몰 (11번가 등등) 에서는 되질 않고 있네요ㅠㅠ 인터넷 개발자 도구 통해서 이름을 안다고 해도 코드자체가 틀리다고 나오네요ㅠㅠ

  6. 안재홍 2017.12.18 22:34 신고

    '438' 런타임 오류가 발생하였습니다.
    개체가 이 속성 또는 메소드를 지원하지 않습니다.

    라는 오류메시지가 뜨면서 디버거는 "검색어 = WorksheetFunction.EncodeURL("맛집")"를 노란색 처리했습니다.
    책의 내용대로 설정을 모두 하고 동영상도 체크하고 소스도 그대로 복사해 붙여 실행해보았습니다.
    내용 보시고 댓글 달아주시면 감사하겠습니다.

  7. berber 2018.03.11 21:37 신고

    안녕하세요? 예제 ex02-1 실행했는데... 에러가 나옵니다.

    '-2147417848(80010108)' 런타임 오류가 발생했습니다.
    자동화 오류입니다
    호출된 개체가 해당 클라이언트로 연결이 끊어졌습니다.

  8. 안준우 2018.03.27 18:22 신고

    엑셀2016, 익스플로러11 버전입니다.

    '-2147417848(80010108)' 런타임 오류가 발생했습니다.
    자동화 오류입니다

    메세지가 나옵니다. 해결방법이 없을까요?

  9. 안준우 2018.03.27 18:49 신고

    엑셀2016, 익스플로러11 버전인데 어떤 멘트를 봐야하나요?

    엑셀 2013 미만 버전이 아닌데 에러가 나거든요.
    너무 잘 보고있는데 한번 더 해결방안 부탁드리겠습니다.

  10. 이재훈 2018.09.12 14:25 신고

    안녕하세요.
    예제코드는 엑셀 2013 미만일 때 소스코드로 이용했고,
    엑셀 2010 버전으로 실행하는데 아래 다른 분들처럼 오류가 발생합니다.
    동영상 웹데이터수집의기술01 엑셀VBA 부분 보았는데 관련 설명을 찾지 못하겠습니다.

    -2147024891(8000700005) 런타임 오류가 발생했습니다.
    억세스가 거부되었습니다.

    계속 이렇게 나옵니다.


    안녕하세요? 예제 ex02-1 실행했는데... 에러가 나옵니다.

    '-2147417848(80010108)' 런타임 오류가 발생했습니다.
    억세스가 거부되었습니다.



  11. 이재훈 2018.09.12 14:28 신고

    유튜브 동영상 01엑셀 VBA 강좌와 2013이전 버전으로 올려주신 소스코드
    엑셀은 2010버전으로 첫 번째 예제 구동시에
    -2147024891 (800700005) 런타임 오류가 발생하였습니다. 억세스가 거부되었습니다.
    계속 이렇게 메시지가 나옵니다. 동영상을 봐도 잘 모르겠습니다. 어떻게 진행해야 하나요?

    • BlogIcon KyeongRok Kim 2018.09.12 14:29 신고

      소스코드를 올려주실수 있으실까요

    • 이재훈 2018.09.12 14:31 신고

      올려주신 소스 그대로입니다.

      Private 인터넷익스플로러 As InternetExplorer
      Sub main()
      'IE 객체 작성
      Set 인터넷익스플로러 = CreateObject("InternetExplorer.Application")
      검색어 = ENCODEURL("맛집")
      페이지주소 = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=" & 검색어

      인터넷익스플로러.Visible = True
      인터넷익스플로러.Navigate2 (페이지주소)

      '읽기 완료 대기
      While 인터넷익스플로러.ReadyState <> READYSTATE_COMPLETE Or 인터넷익스플로러.Busy = True
      DoEvents
      Application.Wait (Now + TimeValue("0:00:01"))
      Wend
      Application.Wait (Now + TimeValue("0:00:01"))

      '엑셀 시트에 검색 결과 출력하기
      Row = 1
      For Each element In 인터넷익스플로러.Document.getElementsByClassName("sh_blog_title ")
      Worksheets(1).Cells(Row, 1) = Row
      Worksheets(1).Cells(Row, 2) = element.innerText
      Row = Row + 1
      Next element
      인터넷익스플로러.Quit
      Set 인터넷익스플로러 = Nothing
      End Sub


      Function ENCODEURL(varText As Variant, Optional blnEncode = True)
      Static objHtmlfile As Object
      If objHtmlfile Is Nothing Then
      Set objHtmlfile = CreateObject("htmlfile")
      With objHtmlfile.parentWindow
      .execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
      End With
      End If
      If blnEncode Then
      ENCODEURL = objHtmlfile.parentWindow.encode(varText)
      End If
      End Function

    • 이재훈 2018.09.12 14:33 신고

      동영상에서 글로적어주신
      VBE 참조 설정 추가하기 까지 모두 설정하였는데도 동일합니다.

    • BlogIcon KyeongRok Kim 2018.09.12 14:56 신고

      sub main()
      range("a1").value = "hello"
      end sub

      위 소스코드를 실행하면 a1셀에 hello가 나옵니다. 이건 실행 되는지 한번 봐주시겠어요

    • 이재훈 2018.09.12 15:02 신고

      네.
      적어주신 예제는 잘 됩니다.
      잘 됩니다. ^^

    • BlogIcon KyeongRok Kim 2018.09.12 15:07 신고

      일단은 제 노트북 2대에서 오피스 최신버젼으로 실행 했을 때는 실행이 잘 되어서 제가 디버깅을 해드리기는 어려운 상황이네요.

      권한 관련 문제로 보입니다.

      https://answers.microsoft.com/en-us/windows/forum/windows_other/update-error-code-800700005/819f059e-9846-4614-95b6-9d3e19b5e19b

      해당 기능의 실행을 특정 보안프로그램 등이 막고 있는 경우에 안되는 것 같은데요

      회사라면 회사의 보안프로그램일 수 있습니다만 개인 pc이신가요?

    • 이재훈 2018.09.12 15:16 신고

      회사 컴퓨터인데 별다른 보안 프로그램이 구동되지는 않습니다.

      억세스가 거부되었습니다. 메시지 창에 디버그 버튼 있지요? 그걸 누르면 ENCODE 함수 내부의

      .execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"

      이 부분에 노란색 줄이쳐지고 여기서 멈추는 것 같습니다.

      지금 엑셀이 전부 2010 버전인데 저도 다른 컴퓨터에서 해보니 동일한 오류가 나오네요.

      집에가서 엑셀 2016 버전으로 다시 해보고 결과 올리겠습니다. 바쁘신데 이렇게 봐주셔서 감사합니다.

    • 이재훈 2018.09.12 23:29 신고

      엑셀 2016 버전에서는 문제없이 잘 돌아가네요.

      엑셀 2010버전에서는 올려주신 소스코드(2010용으로 올려주신 소스)로 해도 같은 에러가 발생하구요..

      일단은 2016 버전으로 계속 해보겠습니다. 감사합니다.

  12. 이재훈 2018.09.14 11:32 신고

    도서 116페이지 import.io 에서 integrate 부분은 이제 사용할 수 없나요?
    교재에 기재된 방식으로 하는데 integrate 부분 누르면 이제는 upgrade(유료서비스) 가입하라고 나오네요.