크롤러 만들기 [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)
}
실행해보면
링크와
제목과
본문 수집이 잘 되네요.
28초가 소요되었습니다. (2배가 걸리는 겁니다. 더 줄여야 합니다.)
이제 수집 결과를 반환할 때 쌩텍스트로 반환을 하는 것을
JSON으로 반환하게 만드는 것과 최적화가 목표가 되겠네요.
-> 미리보는 결과물 (이때 소요시간 14초)
!-->!-->
추천
0
0
댓글 0개