테스트 사이트 - 개발 중인 베타 버전입니다

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

· 2년 전 · 489

오랜만입니다.

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

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

 

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

 

/app/controllers/crawl_controller.go

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

[code]

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

}

[/code]

 

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

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

 

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

 

/app/controllers/web_controller.go

[code]

...

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)

}

[/code]

 

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

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

게시글 목록

번호 제목
92
82
80
79
78
77
76
75
72
65
64
63
62
57
55
54
53
52
51
50
46
44
43
39
34
29
28
27
26
22