오랜만입니다.
그동안 퇴사하고 빈둥빈둥 노느라 글 쓰는 걸 까먹고 있었네요.
그럼 바로 시작하겠습니다.
저번 게시물에서는 게시글의 링크를 수집했습니다. 이제 이 링크를 따라 들어가서 해당 링크의 제목과 본문을 수집해봅시다.
/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]

실행해보면

링크와

제목과

본문 수집이 잘 되네요.
![]()
28초가 소요되었습니다. (2배가 걸리는 겁니다. 더 줄여야 합니다.)
이제 수집 결과를 반환할 때 쌩텍스트로 반환을 하는 것을
JSON으로 반환하게 만드는 것과 최적화가 목표가 되겠네요.
-> 미리보는 결과물 (이때 소요시간 14초)

게시글 목록
| 번호 | 제목 |
|---|---|
| 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 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기