고랭지농업

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

· 2023-03-03 (금) 20:33:23 · 735

오랜만입니다.

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

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

 

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

 

/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

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

Golang

39건
+
제목 글쓴이 날짜 조회
23-12-06 조회 645
23-03-15 조회 1,322
23-03-15 조회 639
23-03-03 조회 865
23-03-03 조회 736
23-02-06 조회 1,028
23-02-05 조회 689
23-02-05 조회 747
23-01-07 조회 730
22-12-23 조회 1,036
22-12-11 조회 1,155
22-12-02 조회 724
22-04-08 조회 1,044
22-02-22 조회 1,102
22-02-22 조회 1,258
22-02-05 조회 1,169
21-10-17 조회 1,776
21-10-10 조회 1,442
21-10-10 조회 1,347
21-10-10 조회 1,417
21-10-08 조회 1,344
21-10-04 조회 1,286
21-05-22 조회 1,334
21-04-22 조회 1,967
20-09-01 조회 1,408
20-02-23 조회 2,405
20-02-16 조회 1,779
20-02-16 조회 1,397
19-12-23 조회 1,628
19-12-11 조회 1,372