크롤러 만들기 [4] - 게시물 제목 및 본문 수집 테스트 > Golang

Golang

크롤러 만들기 [4] - 게시물 제목 및 본문 수집 테스트 정보

크롤러 만들기 [4] - 게시물 제목 및 본문 수집 테스트

본문

오랜만입니다.

그동안 퇴사하고 빈둥빈둥 노느라 글 쓰는 걸 까먹고 있었네요.

그럼 바로 시작하겠습니다.

 

저번 게시물에서는 게시글의 링크를 수집했습니다. 이제 이 링크를 따라 들어가서 해당 링크의 제목과 본문을 수집해봅시다.

 

/app/controllers/crawl_controller.go

- 제목과 본문을 수집할 수 있게 코드를 수정합니다.


package controllers
 
import (
    "regexp"
    "strconv"
    "strings"
 
    "github.com/go-resty/resty/v2"
)
 
func crawl(url string, reg map[string]string) ([]string, []string, []string, error) {
    client := resty.New()
    url = strings.Split(url, ":page:")[0]
    var urlResult, contentResult, subjectResult []string
 
    urlResult, err := boardCrawl(client, url, reg["url"])
    if err != nil {
        return nil, nil, nil, err
    }
 
    subjectResult, err := contentCrawl(client, urlResult, reg["subject"])
    if err != nil {
        return nil, nil, nil, err
    }
 
    contentResult, err := contentCrawl(client, urlResult, reg["content"])
    if err != nil {
        return nil, nil, nil, err
    }
 
    return urlResult, subjectResult, contentResult, nil
}
 
func boardCrawl(client *resty.Client, url string, regex string) ([]string, error) {
    urlResult := make([]string, 0)
 
    for i := 1; ; i++ {
        strIndex := strconv.Itoa(i)
        resp, err := client.R().Get(url + strIndex)
        if err != nil {
            return nil, err
        }
   
        regex = `(?m)` + regex
 
        reg, err := regexp.Complie(regex)
        if err != nil {
            return nil, err
        }
 
        if len(reg.FindString(resp.String())) == 0 {
            break
        }
 
        for _, match := range reg.FindAllString(resp.String(), -1) {
            urlStr := strings.ReplaceAll(reg.FindStringSubmatch(match)[1], "&", "&")
            urlResult = append(urlResult, urlStr)
        }
    }
    return urlResult, nil
}
 
func contentCrawl(client *resty.Client, url []string, regex string) ([]string, error) {
    result := make([]string, 0)
 
    regex = `(?m)` + regex
    reg, err := regexp.Complie(regex)
    if err != nil {
        return nil, err
    }
 
    for i := 0; i < len(url); i++ {
        resp, err := client.R().Get(url[i])
        if err != nil {
            return result, err
        }
       
        for _, match := range reg.FindAllString(resp.String(), -1) {
            result = append(result, reg.FindStringSubmatch(match)[1])
        }
    }
    return result, nil
}

 

이제 crawl 함수는 총 4개의 값을 반환합니다.

링크 모음, 제목 모음, 본문 모음, 에러

 

이 crawl 함수를 불러오는 부분도 수정해야 정상적으로 값을 받을 수 있습니다.

 

/app/controllers/web_controller.go


...
func Crawl(c *fiber.Ctx) error {
    url := c.FormValue("url")
    reg := make(map[string]string)
    reg["url"] = c.FormValue("regex_url")
    reg["subject"] = c.FormValue("regex_subject")
    reg["content"] = c.FormValue("regex_content")
 
    urlResult, subjectResult, contentResult, err := crawl(url, reg)
    if err != nil {
        return c.SendString(err.Error())
    }
 
    return c.SendString(fmt.Sprintf("%v\n\n\n%v\n\n\n%v", urlResult, subjectResult, contentResult)
}

 

1030332716_1677842931.779.png

 

실행해보면

 

1030332716_1677842985.3083.png

링크와

 

1030332716_1677843000.3213.png

제목과

 

1030332716_1677843013.5512.png

본문 수집이 잘 되네요.

 

1030332716_1677843029.4298.png

28초가 소요되었습니다. (2배가 걸리는 겁니다. 더 줄여야 합니다.)

 

 

이제 수집 결과를 반환할 때 쌩텍스트로 반환을 하는 것을

JSON으로 반환하게 만드는 것과 최적화가 목표가 되겠네요.

 

-> 미리보는 결과물 (이때 소요시간 14초)

1030332716_1677843192.7132.png

추천
0

댓글 0개

전체 40 |RSS
Golang 내용 검색

회원로그인

진행중 포인트경매

  1. 참여4 회 시작24.04.25 20:23 종료24.05.02 20:23
(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT