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 처리를 하는 내용을 살펴보았다.
'IT > golang' 카테고리의 다른 글
go언어 이미지 수집기(crawler) 소스코드 공유 (0) | 2021.12.23 |
---|---|
golang/go언어 프로그램의 구조 설명과 예제 (0) | 2021.12.22 |
go언어 개요와 배경 설명 (0) | 2021.12.20 |
댓글