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

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

· 2년 전 · 490

오랜만입니다.

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

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

 

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

 

/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

댓글 작성

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

로그인하기

게시글 목록

번호 제목
20
15
12
8
7
6
3
2
1