Job 스크랩 (1)

박도준·2021년 3월 3일
0

Golang

목록 보기
1/3

그동안 배운 go언어을 통해 indeed 홈페이지에서 golang을 검색했을 때의 관련 job들을 가져오는 실습을 해보았다.

해야할 동작은 크게 아래와 같다.

  • indeed 페이지 수 받아오기
  • 각 페이지 URL 생성
  • 페이지로부터 일자리 추출
  • 추출한 job들의 정보를 엑셀에 담기


⭐ indeed 페이지 수 받아오기

페이지

우선 indeed 페이지에 접속하여 원하는 검색어로 검색한다.
그리고 첫페이지의 주소를 baseURL로 저장한다.

var baseURL string = "https://kr.indeed.com/jobs?q=golang"

전역변수는 := 를 사용할 수 없고 무조건 var 형식으로 선언해야 한다.

페이지 수를 받아오는 함수인 getPages()를 생성한다.
페이지 수를 반환해야 하기 때문에 return type은 int로 선언한다.

위에서 만든 baseURL에 대한 정보를 가져오기 위해 Go의 표준 패키지인 http 패키지를 사용한다.
url에 헤더나 스트림을 추가할 것이 아니기 때문에 http.Get() 메서드를 사용한다.
이때 *http.Response타입의 resp와 error타입의 err을 반환한다

각각을 res, err로 return 받은 후 에러를 확인해준다.
Go언어에서는 try-catch 같이 예외처리 기능이 없어, if문을 통해 에러발생 여부를 확인해주어야 한다.

이때 에러를 계속 체크해줘야 하기 때문에 따로 함수를 만들어 처리했다.

func getPages() int { 
	res, err := http.Get(baseURL)
	checkErr(err)
	checkCode(res)
}

func checkErr(err error) {
	if err != nil { 
		log.Fatalln(err) 
	}
}

func checkCode(res *http.Response) { 
	if res.StatusCode != 200 {
		log.Fatalln("Request failed with Status: ", res.StatusCode)
	}
}

📍 goquery 사용

indeed 페이지 정보를 받아오기 위해 html 파싱이 필요한데 go에서는 goquery를 이용한다.

goquery를 사용하기 위해서는 goquery를 설치해야 하는데 아래와 같은 명령어로 설치를 한다.

$ go get github.com/PuerkitoBio/goquery

참고 github


html document를 받아오기 위해 goquery.NewDocumentFromReader를 이용한다.

이때 지연 실행 defer를 사용한다.

Go 언어의 defer는 특정 문장 혹은 함수를 defer가 속해있는 함수가 리턴하기 직전에 실행하게 한다.

defer를 사용하여 goquery.NewDocumentFromReader에서 읽어들이는 res.Body에 대해 Close()하여 메모리가 새어 나가는 것을 막아준다.

작성한 코드는 아래와 같다.

func getPages() int { 
	res, err := http.Get(baseURL)
	checkErr(err)
	checkCode(res)

	defer res.Body.Close()

	doc, err := goquery.NewDocumentFromReader(res.Body) //res.Body는 기본적으로 byte
	checkErr(err)
}


페이지를 받아오기 위해 Find() 메서드를 사용하여 pagination 클래스 정보를 받아온다.

이때 Each func을 함께 사용하여 pagination 클래스 내에 링크의 수를 통해 페이지 수를 알아낸다.

doc.Find(".pagination").Each(func(i int, s *goquery.Selection) {
		pages = s.Find("a").Length()
	})


👉 Job 스크랩 (2)

profile
Better late than never

0개의 댓글