동시에 웹페이지에 접속하여 각 페이지의 제목을 추출하고 해당 제목을 터미널에 표시합니다. 이는 Go의 동시성을 사용하여 수행되며, 이를 통해 여러 페이지에 동시에 액세스하여 시간을 절약할 수 있습니다.
import ( "fmt" "net/http" "sync" "github.com/PuerkitoBio/goquery" )
이 역할은 다음을 담당합니다.
func fetchTitle(url string, wg *sync.WaitGroup, results chan<- string) { defer wg.Done() // Marca a goroutine como concluída no WaitGroup
기능 매개변수:
defer wg.Done() 라인은 fetchTitle 함수가 완료되면 이 작업(고루틴)을 완료된 것으로 표시하도록 프로그램에 지시합니다. 이는 모든 작업이 언제 완료되었는지 Main이 알 수 있도록 중요합니다.
요청, 오류 := http.Get(url)
오류가 있는 경우 != nil {
결과 <- fmt.Sprintf("%s 액세스 오류: %v", url, err)
복귀
}
요청 연기.Body.Close()
req.StatusCode != 200인 경우 {
결과 <- fmt.Sprintf("%s 액세스 오류: 상태 %d %s", url, req.StatusCode, req.Status)
복귀
}
doc, err := goquery.NewDocumentFromReader(req.Body)
오류가 있는 경우 != nil {
결과 <- fmt.Sprintf("%s에서 문서를 로드하는 중 오류 발생: %v", url, err)
복귀
}
title := doc.Find("title").Text()
결과 <- fmt.Sprintf("%s의 제목: %s", url, title)
}
메인 기능은 프로그램을 구성하고 제어하는 주요 기능입니다.
func 메인() {
urls := []문자열{
"http://olos.novagne.com.br/Olos/login.aspx?logout=true",
"http://sistema.novagne.com.br/novagne/",
}
var wg sync.WaitGroup
results := make(chan string, len(urls)) // 결과를 저장할 채널
for _, url := 범위 URL {
wg.추가(1)
fetchTitle(url, &wg, 결과)로 이동
}
wg.잠깐()
닫기(결과)
REPO: https://github.com/ionnss/Scrapper-GoRoutine
이온,
또 지구의 날
위 내용은 스크래퍼 경쟁자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!