아래 뜨는 Download 나 PC App Store는 모두의 프린터와 상관없는 광고입니다!!
특히 PC App Store는 악성 소프트웨어이니 절대 클릭하지 마세요!!
모두의 프린터는 어떠한 경우에도 본인인증, 회원가입, 카드결제를 요구하지 않습니다.
다운로드를 유도하는 애드센스 광고를 피로곰이 배포하는 프로그램들의 다운로드 링크로 착각하지 않도록 주의하시기 바랍니다. 피로곰이 배포하는 모든 프로그램은 본인인증, 회원가입, 이용료 결제 없이 무료로 사용가능합니다.
많이 찾는 글들...
  1. MS윈도 디펜더(바이러스 백신) 예외설정 방법
  2. ghostscript 실행파일 경로가 지정되어 있지 않아서 변환할 수 없습니다.
  3. PC App Store 제거 방법
  4. Ghostscript/GhostPCL 설치 안내
  5. 파일 다운로드가 차단되는 경우
  6. 내 컴퓨터의 32비트,64비트 여부 아는법
  7. 'Windows의 PC 보호' 문제
  8. 모두의 프린터 실행후 환경설정창 뜨지 않고 무반응
  9. Ghostscript PDF변환 불가. Can't load Ghostscript DLL
  10. 대법원 인터넷 등기소, 전자소송, 경매,전자공탁등 대법원계열 사이트관련
  11. 모두의 프린터 사용후 네트워크 장애가 발생하는경우. (대법원 인터넷등기소 등)
  12. 출력시 모두의 프린터가 강제종료 되는 경우.'지원하지 않는 PDF또는 가상 프린터입니다.'
  13. 오픽(OPic), 연결상태 확인 불가 프린터, 등록되지 않은 프린터(MarkAny e-PageSAFER)
  14. YBM 토익성적표 관련(정상적인 프린터로 출력을 진행하시기 바랍니다)
  15. 리포트뷰어(ReportViewer) 관련(특수목적프린터, 문서변환 프로그램을 제거해주세요)
  16. 인터넷증명발급센터 서트피아(Certpia) 관련 안내
  17. 인강사이트 관련 - 출력에 매우 오래 걸림, PDF파일 버벅거림, PDF여는데 오래걸림 등등
  18. '잘못된 프린터 데이터를 수신하였습니다.' 문제
  19. MS서피스, 삼성 갤럭시북 등 ARM기반 랩탑, '잘못된 프린터 데이터를 수신하였습니다.' 문제

Go로 웹크롤러 만들기 #2

1편에 이어서 진행해 보겠습니다. 우선 적당한 위치에 폴더하나를 만드시구요.  저는 GOWEB이라고 만들었습니다.

생성한 폴더를 선택후 우클릭 -> Code(으)로 열기하여 VSCode로 프로젝트를 엽니다.

main.go 파일을 하나 생성 하십시요.

package main

func main(){

}

import 용 패키지가 아닌 실행파일을 만들 예정이니 첫줄은 닥치고 package main! 빈 main 함수도 미리 하나 만들어 두시구요.

앞서 1편에서 크롤러에 필요한 여러 기술들에 대해서 나열을 했습니다만. 보통 HTML 데이터를 수신받아서 파싱(Parsing)해주는 역할을 하는 패키지들은 대부분 http나 https를 통한 데이터 수신까지 한번에 해주기도 합니다.

다양한 종류의 HTML 파서가 존재 하는데요 제가 즐겨 쓰는것은 goquery 라는 놈을 즐겨 사용합니다. 흔히 자바스크립트로 웹코딩시 많이 사용하던 jqeury 의 seletor 문법을 Go에서 사용하여 DOM Element에 대한 객체처리가 가능한 놈입니다. 파이썬에서 많이 사용하는 BeautifulSoup? 그런류의 것이라 생각 하심 됩니다.

깃헙이나 레퍼런스는 위 주소에서 참고하시기 바라구요.. 일단 ㅋㅋ 저것들이 중요한것은 아니니까 .. 지금 이순간 중요한건 뭐다? 패.키.지.설.치!

터미널을 하나 띄우시구요.

go get github.com/PuerkitoBio/goquery

라고 터미널 창에 입력후 엔터를 치시면 goquery 패키지가 Go언어 경로에 설치가 됩니다. ( 원래 Go는 ;; 설치가 잘 되면 아무말 없;;; ) 자 goquery 를 이용해 웹페이지의 특정 값을 파싱하여 가져오는 가장 기본적인 구조를 해봅시다.

우선 모두의 프린터의 저 버전 값을 가져와 보도록 하겠습니다. 크롤러를 만들때 가장 먼저 익숙해져야 할것은 웹브라우저의 개발자도구입니다. 개인적으론 크롬의 개발자도구를 가장 선호하기 때문에 크롬을 기준으로 설명 드리겠습니다. 개발자도구를 켜는 법은 F12키를 누르시거나

메뉴를 통해 켜실수도 있습니다. 과거에는 이런 좋은 도구들이 제공되지 않아서 HTML 소스 자체를 하나하나 다 분석해가면서 DOM 구조를 파악하고 id 나 class 값을  따내고 하는 등의 노가다가 극심했는데 ㅎㅎ 세상 많이 좋아졌네요 ㅎㅎ

크롤링에 필요한 값을 따기 위해 웹브라우저에 보여지는 객체위에 마우스커서를 가져가신후 우클릭 -> 검사를 선택합니다

그러면 개발자 도구의 Elements 탭에 선택한 객체의 HTML 코드내용이 위와같이 선택(반전)되서 표시됩니다. 모두의 프린터의 관리페이지의 버전값을 표시해주는 저 객체는 Button 태그에 btn, btn-sm 이라는 클래스를 사용중이고 mop-title 이라는 id 값을 가지고 있네요.

자 그럼 이놈을 goquery 로 값을 가져와 보도록 합시다. 우선 goquery 라는 놈이 jqeury의 selector 형식으로 객체를 다룰수 있다고 말씀드렸는데요. 원하는 객체의 DOM Seletor 경로를 얻는 방법은

위와 같이 Elements에서 원하는 객체의 HTML 구문을 선택 후 마우스 우클릭 -> Copy -> Copy selector 를 선택하시면클립보드에 복사가 됩니다.

#mop-title

이렇게 복사가 될겁니다. 이 정보들을 가지고 간단히 데이터를 얻어보도록 하겠습니다.

package main

import (
	"fmt"

	"github.com/PuerkitoBio/goquery"
)

func basic1() {

	// 모프 관리페이지 URL은 실행시마다 다름
	doc, docErr := goquery.NewDocument("http://127.0.0.1:13399/")

	// goquery 에러 처리
	if docErr != nil {
		fmt.Println(docErr.Error())
		return
	}

	// id 값 mop-title 찾기
	mopTitle := doc.Find("#mop-title")

	// 객체가 있으면
	if mopTitle != nil {
		fmt.Println(mopTitle.Text()) // inner-text
		fmt.Println(mopTitle.Html()) // inner-html
	}
}

func main() {
	basic1()
}

이렇게 입력후에 실행을 해보시면 되는데..  간단히 코드에 대한 설명을 하자면..

	// 모프 관리페이지 URL은 실행시마다 다름
	doc, docErr := goquery.NewDocument("http://127.0.0.1:9200/")

goquery 패키지에는 http, https 프로토콜을 통해 URL만 전달하면 알아서 웹페이지의 HTML을 가져다 파싱해주는 함수가 존재합니다. 위와 같이 NewDocument 함수에 URL만 전달하면 .. 파싱한 데이터를 배터내지요.

	// goquery 에러 처리
	if docErr != nil {
		fmt.Println(docErr.Error())
		return
	}

예외처리는 습관적으로 하시는게 좋습니다. 귀찮고 불필요해 보여도 언제나 .. 삽질을 줄여주는 고마운 놈이지요. goquery 의 NewDocument 함수가 동작중에 오류가 발생할경우 오류의 원인을 출력하고 basic1 함수는 종료됩니다.

	// id 값 mop-title 찾기
	mopTitle := doc.Find("#mop-title")

	// 객체가 있으면
	if mopTitle != nil {
		fmt.Println(mopTitle.Text()) // inner-text
		fmt.Println(mopTitle.Html()) // inner-html
	}

마지막으로 .. doc 변수에 파싱(Parsing)되어 저장된 데이터를 가지고 지지고 볶아야 하는데.. 앞서 설명했듯이 mop-title 이라는 id 값을 가진 객체를 찾으려 합니다.. jquery 에서 많이 볼수 있지요.. id 값을 검색할땐 #로 시작.. class 값을 검색할때는 .으로 시작.. 이런걸 selector 라고 하지요 mop-title 이라는 id 값을 가진 객체를 검색할꺼니.. 

	// id 값 mop-title 찾기
	mopTitle := doc.Find("#mop-title")

이렇게 검색을 합니다. 만약 Find함수에 전달된 selector 조건에 해당하는 객체가 없는 경우에는 doc.Find함수의 결과값은 비어(nil : 보통 말하는 null의 go표현)있습니다.

	// 객체가 있으면
	if mopTitle != nil {
		fmt.Println(mopTitle.Text()) // inner-text
		fmt.Println(mopTitle.Html()) // inner-html
	}

doc.Find 의 결과인 mopTitle 변수가 nil 아니라면 객체가 찾아진 것이니 해당 객체의 값을 출력하고 종료됩니다. 이제 실행을 해볼텐데요 

이렇게 go build 명령을 사용해서 실행파일을 만든후에  GOWEB.exe 파일을 실행해보는 방법도 있구요. ( 기본적으로 폴더명이 실행파일명이 됨 ) 개발과정에선 디버깅모드로 실행해 버릇하는게 좋긴 하니까 ..

F5를 눌러서 실행하세요.. 근데 프로젝트 폴더를 처음 만든경우에는 F5 키를 눌러 실행하려는경우

이런식으로 매번 어떤 언어를 위한 디버깅을 할거냐 라고 매번 귀찮게 묻게 됩니다. 귀찮은거 좋아하시면 Go를 매번 선택해서 실행하시구요.. 제가 권장드리는건 ..

좌측 사이드의 아이콘중에 벌레가 그려진 플레이 버튼 같은 4번째 사이드 탭을 클릭하시고 .. create a launch.json file 을 클릭

Go 선택

이렇게 디버깅시 실행옵션등을 담은 launch.json 파일이 생성됩니다. 이후로는 .. F5만 누르시면 바로 디버깅 모드로 실행됩니다.

실행을 하면 위와 같이 .. DEBUG CONSOLE에 크롤링한 내용이 출력됩니다.

.Text와 .Html 의 차이는 선택된 Tag 안에 존재하는 텍스트만을 추출할지 HTML Tag까지 포함하여 추출할지를 필요에 따라 사용가능합니다. 데이터를 가져오고 객체를 찾아 값을 출력하는 가장 기본적인 내용을 다뤄 보았습니다. 크롤링과 관련된 다양한 예제를 앞으로  계속 진행해 보도록 하겠습니다.

많이 찾는 글들...
  1. MS윈도 디펜더(바이러스 백신) 예외설정 방법
  2. ghostscript 실행파일 경로가 지정되어 있지 않아서 변환할 수 없습니다.
  3. PC App Store 제거 방법
  4. Ghostscript/GhostPCL 설치 안내
  5. 파일 다운로드가 차단되는 경우
  6. 내 컴퓨터의 32비트,64비트 여부 아는법
  7. 'Windows의 PC 보호' 문제
  8. 모두의 프린터 실행후 환경설정창 뜨지 않고 무반응
  9. Ghostscript PDF변환 불가. Can't load Ghostscript DLL
  10. 대법원 인터넷 등기소, 전자소송, 경매,전자공탁등 대법원계열 사이트관련
  11. 모두의 프린터 사용후 네트워크 장애가 발생하는경우. (대법원 인터넷등기소 등)
  12. 출력시 모두의 프린터가 강제종료 되는 경우.'지원하지 않는 PDF또는 가상 프린터입니다.'
  13. 오픽(OPic), 연결상태 확인 불가 프린터, 등록되지 않은 프린터(MarkAny e-PageSAFER)
  14. YBM 토익성적표 관련(정상적인 프린터로 출력을 진행하시기 바랍니다)
  15. 리포트뷰어(ReportViewer) 관련(특수목적프린터, 문서변환 프로그램을 제거해주세요)
  16. 인터넷증명발급센터 서트피아(Certpia) 관련 안내
  17. 인강사이트 관련 - 출력에 매우 오래 걸림, PDF파일 버벅거림, PDF여는데 오래걸림 등등
  18. '잘못된 프린터 데이터를 수신하였습니다.' 문제
  19. MS서피스, 삼성 갤럭시북 등 ARM기반 랩탑, '잘못된 프린터 데이터를 수신하였습니다.' 문제

모두의프린터에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기