본문 바로가기

go 학습

Golang으로 웹 크롤러(web crawler) 만들기(feat chatGTP)

요즘 세간의 화제인 chatGTP로 놀아보다가 

 

얘가 코딩도 해준다는 이야기를 듣고 GO로 만들 수 있는 프로그램을 추천해 주라고 시켜봤더니

 

Go (Golang)을 사용하여 만들 수 있는 프로젝트의 예는 다음과 같습니다:

  1. RESTful API: Go에서 HTTP 통신을 처리할 수 있는 라이브러리를 사용하여 RESTful API를 만들 수 있습니다.
  2. Web 크롤러: Go에서 HTTP 통신을 처리할 수 있는 라이브러리를 사용하여 웹 페이지에서 데이터를 수집할 수 있습니다.
  3. 채팅 어플리케이션: Go에서 제공하는 네트워크 프로그래밍 라이브러리를 사용하여 채팅 어플리케이션을 만들 수 있습니다.
  4. 데이터베이스 프로그램: Go에서 제공하는 SQL 라이브러리를 사용하여 데이터베이스 프로그램을 만들 수 있습니다.
  5. 비동기 처리 프로그램: Go에서 제공하는 Goroutine과 Channel 기능을 사용하여 비동기 처리 프로그램을 만들 수 있습니다.

이외에도 다양한 프로젝트를 Go로 만들 수 있습니다. 개

 

이렇게 추천해 주었다.

 

WEB크롤러가 재미있어 보여서 웹 크롤러 만들어 달라고 했더니

 

Go언어를 사용하여 웹 크롤러를 만드는 것은 매우 쉽습니다. 아래는 간단한 웹 크롤러 예제입니다.

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    url := "https://www.example.com"
    response, err := http.Get(url)
    if err != nil {
        fmt.Printf("The HTTP request failed with error %s\n", err)
    } else {
        data, _ := ioutil.ReadAll(response.Body)
        fmt.Println(string(data))
    }
}

위의 코드에서 http.Get 함수를 사용하여 URL에 대한 HTTP GET 요청을 보내고, ioutil.ReadAll 함수를 사용하여 응답 본문의 내용을 읽습니다.

이 코드를 실행하면 웹 페이지의 HTML 내용이 표시됩니다. 그러나, 이것은 간단한 웹 크롤러일 뿐이며, 웹 페이지에서 데이터를 정확하게 추출하는 것은 더욱 복잡할 수 있습니다.

 

와 레게노

 

코드를 짜는것 뿐만 아니라 흐름을 읽고 해석까지 해주었다.

 

여기서 

http.Get함수와 ioutil.ReadAll

함수가 뭔지 궁굼하기 때문에 쳇 gtp에 질문해 보자

 

 

1.http.Get

 

Go 언어에서 "net/http" 패키지에서 "Get" 함수는 URL의 자원을 HTTP GET 요청으로 얻는 기능을 제공합니다.

"Get" 함수의 사용 방법:

resp, err := http.Get(url)
  • url: 요청할 URL
  • resp: HTTP 응답
  • err: 요청에 대한 에러 (성공하면 nil)
  •  

2.ioutil.ReadAll

 

ioutil.ReadAll 함수는 Go의 io/ioutil 패키지에서 제공하는 함수로, 특정 io.Reader 구조체를 전부 읽어서 바이트 슬라이스에 저장할 수 있는 기능을 제공합니다.

함수 형식:

func ReadAll(r io.Reader) ([]byte, error)

인자로 전달하는 r은 읽을 대상이 되는 io.Reader 구조체입니다. ReadAll 함수는 전달받은 r에서 더 이상 읽을 데이터가 없을 때까지 모든 데이터를 읽어서 []byte 형식의 바이트 슬라이스에 저장합니다.

함수 실행 과정에서 오류가 발생하면 error 값을 반환합니다.

 

 

 

 

 

 

 

 

하지만 여기서 AI의 작은 실수 한가지

 

2021년 초 GO.1.16버전 부터 

 

메소드 사용에 혼동이 있어 "io/ioutil" 페키지는 권장되지 않게 되었다.

 

ioutill 페키지의 메소드 들은

ioutil.Discard => io.Discard
ioutil.NopCloser => io.NopCloser
ioutil.ReadAll => io.ReadAll
ioutil.ReadDir => os.ReadDir (주의 : fs.FileInfo 슬라이스가 아닌 os.DirEntry의 슬라이스가 반환된다.)
ioutil.ReadFile => os.ReadFile
ioutil.TempDir => os.MkdirTemp
ioutil.TempFile => os.CreateTemp
ioutil.WriteFile => os.WriteFile

이처럼 사용방식이 바뀌었다.

 

 

위 코드의 

ioutil.ReadAll => io.ReadAll

로 바꿔주고 나니 실행이 정상적으로 작동되었다.