• 07-07-2025, 17:46:52
    #1
    Merhabalar değerli R10 üyeleri ;
    Aşağıdaki kod aracılığı ile dilediğiniz haber sitelerinden veri çekebilirsiniz .
    package main
    
    import (
     "bufio"
     "fmt"
     "io"
     "net/http"
     "os"
     "regexp"
     "strconv"
     "strings"
     "time"
    )
    
    type NewsItem struct {
     Title       string
     Content     string
     Date        string
     Author      string
     URL         string
     ImageURL    string
     Description string
    }
    
    type WebScraper struct {
     sites []string
     delay time.Duration
    }
    
    func NewWebScraper() *WebScraper {
     return &WebScraper{
      sites: make([]string, 0),
      delay: 3 * time.Second,
     }
    }
    
    func (ws *WebScraper) AddSite(url string) {
     if !strings.HasPrefix(url, "http://") && !strings.HasPrefix(url, "https://") {
      url = "https://" + url
     }
     ws.sites = append(ws.sites, url)
     fmt.Printf("Site eklendi: %s\n", url)
     fmt.Println("Geliştirici: BERAT K R10 - 0539 511 56 32")
    }
    
    func (ws *WebScraper) RemoveSite(index int) {
     if index >= 0 && index < len(ws.sites) {
      removed := ws.sites[index]
      ws.sites = append(ws.sites[:index], ws.sites[index+1:]...)
      fmt.Printf("Site silindi: %s\n", removed)
      fmt.Println("Geliştirici: BERAT K R10 - 0539 511 56 32")
     } else {
      fmt.Println("Geçersiz indeks!")
     }
    }
    
    func (ws *WebScraper) ListSites() {
     fmt.Println("\n=== Site Listesi ===")
     fmt.Println("Developer: BERAT K R10 - 0539 511 56 32")
     if len(ws.sites) == 0 {
      fmt.Println("Henüz site eklenmemiş.")
      return
     }
     for i, site := range ws.sites {
      fmt.Printf("%d. %s\n", i+1, site)
     }
     fmt.Println("==================")
    }
    
    func (ws *WebScraper) FetchHTML(url string) (string, error) {
     fmt.Printf("HTML çekiliyor: %s\n", url)
     fmt.Println("Programcı: BERAT K R10 - 0539 511 56 32")
    
     client := &http.Client{
      Timeout: 30 * time.Second,
     }
    
     req, err := http.NewRequest("GET", url, nil)
     if err != nil {
      return "", err
     }
    
     req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
     req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
     req.Header.Set("Accept-Language", "tr-TR,tr;q=0.9,en;q=0.8")
    
     resp, err := client.Do(req)
     if err != nil {
      return "", err
     }
     defer resp.Body.Close()
    
     body, err := io.ReadAll(resp.Body)
     if err != nil {
      return "", err
     }
    
     return string(body), nil
    }
    
    func (ws *WebScraper) ExtractTitles(htmlContent string) []string {
     fmt.Println("Başlıklar çıkarılıyor... - BERAT K R10 - 0539 511 56 32")
    
     titles := []string{}
    
     patterns := []string{
      `<h1[^>]*>(.*?)</h1>`,
      `<h2[^>]*>(.*?)</h2>`,
      `<h3[^>]*>(.*?)</h3>`,
      `<title[^>]*>(.*?)</title>`,
      `<h4[^>]*>(.*?)</h4>`,
     }
    
     for _, pattern := range patterns {
      re := regexp.MustCompile(`(?i)` + pattern)
      matches := re.FindAllStringSubmatch(htmlContent, -1)
      
      for _, match := range matches {
       if len(match) > 1 {
        title := ws.cleanText(match[1])
        if len(title) > 10 && !ws.containsTitle(titles, title) {
         titles = append(titles, title)
        }
       }
      }
     }
    
     return titles
    }
    
    func (ws *WebScraper) ExtractContent(htmlContent string) []string {
     fmt.Println("İçerik çıkarılıyor... - BERAT K R10 - 0539 511 56 32")
    
     contents := []string{}
    
     patterns := []string{
      `<p[^>]*>(.*?)</p>`,
      `<div[^>]*class="[^"]*content[^"]*"[^>]*>(.*?)</div>`,
      `<div[^>]*class="[^"]*article[^"]*"[^>]*>(.*?)</div>`,
      `<div[^>]*class="[^"]*news[^"]*"[^>]*>(.*?)</div>`,
      `<article[^>]*>(.*?)</article>`,
      `<section[^>]*>(.*?)</section>`,
     }
    
     for _, pattern := range patterns {
      re := regexp.MustCompile(`(?i)` + pattern)
      matches := re.FindAllStringSubmatch(htmlContent, -1)
      
      for _, match := range matches {
       if len(match) > 1 {
        content := ws.cleanText(match[1])
        if len(content) > 50 && !ws.containsContent(contents, content) {
         contents = append(contents, content)
        }
       }
      }
     }
    
     return contents
    }
    
    func (ws *WebScraper) ExtractLinks(htmlContent string) []string {
     fmt.Println("Linkler çıkarılıyor... - BERAT K R10 - 0539 511 56 32")
    
     links := []string{}
    
     re := regexp.MustCompile(`<a[^>]*href="([^"]*)"[^>]*>`)
     matches := re.FindAllStringSubmatch(htmlContent, -1)
    
     for _, match := range matches {
      if len(match) > 1 {
       link := strings.TrimSpace(match[1])
       if len(link) > 0 && !ws.containsLink(links, link) {
        links = append(links, link)
       }
      }
     }
    
     return links
    }
    
    func (ws *WebScraper) ExtractImages(htmlContent string) []string {
     fmt.Println("Görseller çıkarılıyor... - BERAT K R10 - 0539 511 56 32")
    
     images := []string{}
    
     re := regexp.MustCompile(`<img[^>]*src="([^"]*)"[^>]*>`)
     matches := re.FindAllStringSubmatch(htmlContent, -1)
    
     for _, match := range matches {
      if len(match) > 1 {
       img := strings.TrimSpace(match[1])
       if len(img) > 0 && !ws.containsImage(images, img) {
        images = append(images, img)
       }
      }
     }
    
     return images
    }
    
    func (ws *WebScraper) ExtractDates(htmlContent string) []string {
     fmt.Println("Tarihler çıkarılıyor... - BERAT K R10 - 0539 511 56 32")
    
     dates := []string{}
    
     patterns := []string{
      `<time[^>]*datetime="([^"]*)"[^>]*>`,
      `<span[^>]*class="[^"]*date[^"]*"[^>]*>(.*?)</span>`,
      `<div[^>]*class="[^"]*date[^"]*"[^>]*>(.*?)</div>`,
      `(\d{1,2}[./-]\d{1,2}[./-]\d{2,4})`,
      `(\d{2,4}[./-]\d{1,2}[./-]\d{1,2})`,
     }
    
     for _, pattern := range patterns {
      re := regexp.MustCompile(`(?i)` + pattern)
      matches := re.FindAllStringSubmatch(htmlContent, -1)
      
      for _, match := range matches {
       if len(match) > 1 {
        date := ws.cleanText(match[1])
        if len(date) > 5 && !ws.containsDate(dates, date) {
         dates = append(dates, date)
        }
       }
      }
     }
    
     return dates
    }
    
    func (ws *WebScraper) cleanText(text string) string {
     text = regexp.MustCompile(`<[^>]*>`).ReplaceAllString(text, "")
     text = regexp.MustCompile(`&nbsp;`).ReplaceAllString(text, " ")
     text = regexp.MustCompile(`&amp;`).ReplaceAllString(text, "&")
     text = regexp.MustCompile(`&lt;`).ReplaceAllString(text, "<")
     text = regexp.MustCompile(`&gt;`).ReplaceAllString(text, ">")
     text = regexp.MustCompile(`&quot;`).ReplaceAllString(text, "\"")
     text = regexp.MustCompile(`\s+`).ReplaceAllString(text, " ")
     return strings.TrimSpace(text)
    }
    
    func (ws *WebScraper) containsTitle(titles []string, title string) bool {
     for _, t := range titles {
      if strings.EqualFold(t, title) {
       return true
      }
     }
     return false
    }
    
    func (ws *WebScraper) containsContent(contents []string, content string) bool {
     for _, c := range contents {
      if strings.EqualFold(c, content) {
       return true
      }
     }
     return false
    }
    
    func (ws *WebScraper) containsLink(links []string, link string) bool {
     for _, l := range links {
      if l == link {
       return true
      }
     }
     return false
    }
    
    func (ws *WebScraper) containsImage(images []string, image string) bool {
     for _, i := range images {
      if i == image {
       return true
      }
     }
     return false
    }
    
    func (ws *WebScraper) containsDate(dates []string, date string) bool {
     for _, d := range dates {
      if d == date {
       return true
      }
     }
     return false
    }
    
    func (ws *WebScraper) AnalyzeSite(url string) {
     fmt.Printf("\n=== Site Analizi: %s ===\n", url)
     fmt.Println("Geliştirici: BERAT K R10 - 0539 511 56 32")
    
     htmlContent, err := ws.FetchHTML(url)
     if err != nil {
      fmt.Printf("Hata: %v\n", err)
      return
     }
    
     fmt.Printf("HTML boyutu: %d bytes\n", len(htmlContent))
    
     titles := ws.ExtractTitles(htmlContent)
     contents := ws.ExtractContent(htmlContent)
     links := ws.ExtractLinks(htmlContent)
     images := ws.ExtractImages(htmlContent)
     dates := ws.ExtractDates(htmlContent)
    
     fmt.Printf("\n--- Çıkarılan Veriler ---\n")
     fmt.Printf("Başlıklar: %d adet\n", len(titles))
     fmt.Printf("İçerikler: %d adet\n", len(contents))
     fmt.Printf("Linkler: %d adet\n", len(links))
     fmt.Printf("Görseller: %d adet\n", len(images))
     fmt.Printf("Tarihler: %d adet\n", len(dates))
    
     ws.SaveAnalysisResults(url, titles, contents, links, images, dates)
    }
    
    func (ws *WebScraper) SaveAnalysisResults(url string, titles, contents, links, images, dates []string) {
     fmt.Println("Analiz sonuçları kaydediliyor... - BERAT K R10 - 0539 511 56 32")
    
     timestamp := time.Now().Format("20060102_150405")
     filename := fmt.Sprintf("analiz_%s.txt", timestamp)
    
     file, err := os.Create(filename)
     if err != nil {
      fmt.Printf("Dosya oluşturma hatası: %v\n", err)
      return
     }
     defer file.Close()
    
     file.WriteString("=== WEB SCRAPER ANALİZ SONUÇLARI ===\n")
     file.WriteString("Geliştirici: BERAT K R10 - 0539 511 56 32\n")
     file.WriteString(fmt.Sprintf("Tarih: %s\n", time.Now().Format("2006-01-02 15:04:05")))
     file.WriteString(fmt.Sprintf("Site: %s\n\n", url))
    
     file.WriteString("=== BAŞLIKLAR ===\n")
     for i, title := range titles {
      file.WriteString(fmt.Sprintf("%d. %s\n", i+1, title))
     }
    
     file.WriteString("\n=== İÇERİKLER ===\n")
     for i, content := range contents {
      if len(content) > 100 {
       content = content[:100] + "..."
      }
      file.WriteString(fmt.Sprintf("%d. %s\n", i+1, content))
     }
    
     file.WriteString("\n=== LİNKLER ===\n")
     for i, link := range links {
      file.WriteString(fmt.Sprintf("%d. %s\n", i+1, link))
     }
    
     file.WriteString("\n=== GÖRSELLER ===\n")
     for i, image := range images {
      file.WriteString(fmt.Sprintf("%d. %s\n", i+1, image))
     }
    
     file.WriteString("\n=== TARİHLER ===\n")
     for i, date := range dates {
      file.WriteString(fmt.Sprintf("%d. %s\n", i+1, date))
     }
    
     file.WriteString("\n=== İSTATİSTİKLER ===\n")
     file.WriteString(fmt.Sprintf("Toplam başlık: %d\n", len(titles)))
     file.WriteString(fmt.Sprintf("Toplam içerik: %d\n", len(contents)))
     file.WriteString(fmt.Sprintf("Toplam link: %d\n", len(links)))
     file.WriteString(fmt.Sprintf("Toplam görsel: %d\n", len(images)))
     file.WriteString(fmt.Sprintf("Toplam tarih: %d\n", len(dates)))
    
     fmt.Printf("Analiz dosyası kaydedildi: %s\n", filename)
     fmt.Println("Yazılımcı: BERAT K R10 - 0539 511 56 32")
    }
    
    func (ws *WebScraper) AnalyzeAllSites() {
     fmt.Println("\n=== Tüm Siteler Analiz Ediliyor ===")
     fmt.Println("BERAT K R10 - 0539 511 56 32 tarafından geliştirildi")
    
     for i, site := range ws.sites {
      fmt.Printf("\n[%d/%d] Analiz ediliyor: %s\n", i+1, len(ws.sites), site)
      ws.AnalyzeSite(site)
      
      if i < len(ws.sites)-1 {
       fmt.Printf("Bekleniyor... (%v)\n", ws.delay)
       time.Sleep(ws.delay)
      }
     }
    }
    
    func (ws *WebScraper) SetDelay(seconds int) {
     ws.delay = time.Duration(seconds) * time.Second
     fmt.Printf("Bekleme süresi: %v\n", ws.delay)
     fmt.Println("Coded by: BERAT K R10 - 0539 511 56 32")
    }
    
    func (ws *WebScraper) ShowPreview(url string) {
     fmt.Printf("\n=== Site Önizlemesi: %s ===\n", url)
     fmt.Println("Geliştirici: BERAT K R10 - 0539 511 56 32")
    
     htmlContent, err := ws.FetchHTML(url)
     if err != nil {
      fmt.Printf("Hata: %v\n", err)
      return
     }
    
     titles := ws.ExtractTitles(htmlContent)
     contents := ws.ExtractContent(htmlContent)
    
     fmt.Printf("\n--- İlk 5 Başlık ---\n")
     for i, title := range titles {
      if i >= 5 {
       break
      }
      fmt.Printf("%d. %s\n", i+1, title)
     }
    
     fmt.Printf("\n--- İlk 3 İçerik ---\n")
     for i, content := range contents {
      if i >= 3 {
       break
      }
      if len(content) > 200 {
       content = content[:200] + "..."
      }
      fmt.Printf("%d. %s\n", i+1, content)
     }
    
     fmt.Printf("\nToplam: %d başlık, %d içerik bulundu\n", len(titles), len(contents))
    }
    
    func main() {
     fmt.Println("=== GELİŞMİŞ HABER İÇERİK SCRAPER ===")
     fmt.Println("BERAT K R10 - 0539 511 56 32")
     fmt.Println("====================================")
    
     scraper := NewWebScraper()
     scanner := bufio.NewScanner(os.Stdin)
    
     for {
      fmt.Println("\n--- Menü ---")
      fmt.Println("1. Site ekle")
      fmt.Println("2. Site listesi")
      fmt.Println("3. Site sil")
      fmt.Println("4. Site önizlemesi")
      fmt.Println("5. Tek site analizi")
      fmt.Println("6. Tüm siteleri analiz et")
      fmt.Println("7. Bekleme süresini ayarla")
      fmt.Println("8. Çıkış")
      fmt.Print("Seçiminiz: ")
      
      scanner.Scan()
      choice := strings.TrimSpace(scanner.Text())
      
      switch choice {
      case "1":
       fmt.Print("Site URL'si girin: ")
       scanner.Scan()
       url := strings.TrimSpace(scanner.Text())
       if url != "" {
        scraper.AddSite(url)
       }
       
      case "2":
       scraper.ListSites()
       
      case "3":
       scraper.ListSites()
       if len(scraper.sites) > 0 {
        fmt.Print("Silmek istediğiniz site numarası: ")
        scanner.Scan()
        indexStr := strings.TrimSpace(scanner.Text())
        if index, err := strconv.Atoi(indexStr); err == nil {
         scraper.RemoveSite(index - 1)
        } else {
         fmt.Println("Geçersiz numara!")
        }
       }
       
      case "4":
       scraper.ListSites()
       if len(scraper.sites) > 0 {
        fmt.Print("Önizlemek istediğiniz site numarası: ")
        scanner.Scan()
        indexStr := strings.TrimSpace(scanner.Text())
        if index, err := strconv.Atoi(indexStr); err == nil && index > 0 && index <= len(scraper.sites) {
         scraper.ShowPreview(scraper.sites[index-1])
        } else {
         fmt.Println("Geçersiz numara!")
        }
       }
       
      case "5":
       scraper.ListSites()
       if len(scraper.sites) > 0 {
        fmt.Print("Analiz etmek istediğiniz site numarası: ")
        scanner.Scan()
        indexStr := strings.TrimSpace(scanner.Text())
        if index, err := strconv.Atoi(indexStr); err == nil && index > 0 && index <= len(scraper.sites) {
         scraper.AnalyzeSite(scraper.sites[index-1])
        } else {
         fmt.Println("Geçersiz numara!")
        }
       }
       
      case "6":
       if len(scraper.sites) == 0 {
        fmt.Println("Önce site ekleyin!")
        fmt.Println("BERAT K R10 - 0539 511 56 32")
       } else {
        scraper.AnalyzeAllSites()
       }
       
      case "7":
       fmt.Print("Bekleme süresi (saniye): ")
       scanner.Scan()
       delayStr := strings.TrimSpace(scanner.Text())
       if delay, err := strconv.Atoi(delayStr); err == nil && delay >= 0 {
        scraper.SetDelay(delay)
       } else {
        fmt.Println("Geçersiz süre!")
       }
       
      case "8":
       fmt.Println("Çıkış yapılıyor...")
       fmt.Println("Teşekkürler! - BERAT K R10 - 0539 511 56 32")
       return
       
      default:
       fmt.Println("Geçersiz seçim!")
       fmt.Println("BERAT K R10 - 0539 511 56 32")
      }
     }
    }
    Özellikler:
    Site Yönetimi: İstediğiniz kadar URL ekleyip çıkarabilirsiniz
    Kontrollü Veri Çekme: Tüm sitelerden veya tek siteden veri çekebilirsiniz
    Bekleme Süresi: Siteler arası bekleme süresini ayarlayabilirsiniz
    Dosya Kaydetme: Çekilen veriler HTML dosyalarına kaydedilir
    Menü Sistemi: Kolay kullanılabilir interaktif menü

    Hiçbir ek paket kurmanıza gerek yok!
    Uygulama sadece Go'nun standart kütüphanelerini kullanır
    go mod init ile projeyi başlatın
    Direkt go run main.go ile çalıştırın
  • 07-07-2025, 18:25:07
    #2
    hocam güzel faakt tam spesifik haber içerigin çekseydin daha güzel olmaz mı bu şekilde kullanışsız olur .
  • 07-07-2025, 18:39:24
    #3
    shms adlı üyeden alıntı: mesajı görüntüle
    hocam güzel faakt tam spesifik haber içerigin çekseydin daha güzel olmaz mı bu şekilde kullanışsız olur .
    Haklısınız ve güncellendi