Selamlar! Yakın zamanda Go ile web Crawler geliştirdim. Umarım size yardımcı olur. Kodun açıklamaları yorum satırı olarak yanlarında var.
Git:
package main
// Gerekli kütüphanleri ekler
import (
"bufio"
"fmt"
"net/http"
"os"
"strings"
"github.com/PuerkitoBio/goquery"
)
var foundLinks = make(map[string]bool)
func makeRequest(url string) *goquery.Document {
response, err := http.Get(url) // Belirtilen URL'ye bir HTTP GET isteği yapar.
if err != nil {
fmt.Println("Error making request:", err)
return nil
}
defer response.Body.Close()
doc, err := goquery.NewDocumentFromReader(response.Body) // Yanıttan bir goquery belgesi oluşturur.
if err != nil {
fmt.Println("Error parsing response body:", err)
return nil
}
return doc
}
func crawl(url string) {
doc := makeRequest(url) // Belirtilen URL için bir HTTP isteği yapar.
if doc == nil {
return
}
doc.Find("a").Each(func(i int, s *goquery.Selection) { // Tüm <a> etiketlerini seçer ve her biri üzerinde işlem yapar.
foundLink, _ := s.Attr("href") // Her bir <a> etiketinin href özniteliğini alır.
if foundLink != "" { // Boş bir bağlantı değilse işlem yapar.
if strings.Contains(foundLink, "#") { // Bağlantı içinde "#" karakteri varsa bunu kaldırır.
foundLink = strings.Split(foundLink, "#")[0]
}
if strings.Contains(foundLink, url) && !foundLinks[foundLink] { // Bağlantı, ana URL'yi içeriyor ve daha önce ziyaret edilmediyse işlem yapar.
foundLinks[foundLink] = true // Bağlantının ziyaret edildiğini işaretler.
fmt.Println(foundLink) // Bağlantıyı yazdırır.
crawl(foundLink)
}
}
})
}
func main() {
reader := bufio.NewReader(os.Stdin) // Kullanıcıdan giriş almak için bir input oluşturur.
fmt.Print("Enter target URL: ")
targetURL, _ := reader.ReadString('\n') // Kullanıcıdan bir URL alır.
targetURL = strings.TrimSpace(targetURL) // Alınan URL'yi temizler.
crawl(targetURL) // Belirtilen URL üzerinde tarayıcıyı başlatır.
}
Son düzenleme: