본문 바로가기
IT/golang

go언어 HTTP get web page 받아오기 예제와 소스코드

by 어느해겨울 2021. 12. 23.

 

golang/go언어 HTTP get, web page 받아오기

 

이번에 import 해서 사용할 모듈은 3가지다.

 

bufio : buffer 관련 IO 처리를 하는 모듈, NewScanner 함수 사용.

fmt : 포맷 모듈, 출력과 관련 함수 제공.

net/http : network http 관련 method 모듈, Get 함수 사용.

 

이번 역시 go는 http 관련 처리가 무척 쉽다. 몇 가지 모듈로 몇 줄만에 훌륭한 기능을 동작하다니 신기할 따름.

package main

import (
	"bufio"
	"fmt"
	"net/http"
)

func main() {
	resp, err := http.Get("http://golang.com")
	if err != nil {
		panic(err)
	}

	defer resp.Body.Close()
	fmt.Println("Response status:", resp.Status)

	scanner := bufio.NewScanner(resp.Body)
	for i := 0; scanner.Scan() && i < 10; i++ {
		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		panic(err)
	}
}

http.Get 함수를 통해 타겟인 http://golang.com web page 를 읽어온다.

 

여기서 defer 키워드는 C++의 destructor와 비슷한 개념으로 사용되는데 어디서 선언됐든 함수의 마지막에 실행한다.

즉, 이 함수가 기능을 모두 수행하고 종료할 때 resp.Body 를 Close() 한다는 것이다.

 

resp.Status는 타겟 web page에 Get을 수행한 결과를 나타내는데 정상적으로 response 가 이뤄졌다면 200 OK가 나올 것이다.

 

bufio.NewScanner를 통해 resp.Body를 읽어오는 handler를 생성하여 scanner에 대입한다.

그리고 여기선 for loop를 이용하여 10회만 buffer를 scan 한다. buffer scan은 한 번에 1줄(\n)을 읽기 때문에 총 10줄을 읽어서 출력할 것이다.

 

결과는 아래 화면과 같다.

Response status: 200 OK
<!DOCTYPE html>
<html lang="en">
<head>

<link rel="preconnect" href="https://www.googletagmanager.com">
<script >(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  })(window,document,'script','dataLayer','GTM-W8MVQXG');</script>

 

응용하여 버퍼 전체를 읽어 타깃 web page에서 사용하는 특정 리소스를 다운로드(crawling)를 할 수 있다.

여기까지 몇 가지 함수와 짧은 코드로 http get data 처리를 하는 내용을 살펴보았다.

 

 

댓글