> ## Documentation Index
> Fetch the complete documentation index at: https://docs.catproxy.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Go: net/http

> Узнайте, как интегрировать прокси Catproxy в свои приложения на Go с помощью стандартного пакета net/http для высокопроизводительного парсинга.

Go - отличный выбор для создания высокопроизводительных параллельных веб-парсеров. Интеграция прокси Catproxy выполняется просто с помощью пакета стандартной библиотеки `net/http` путем настройки пользовательского `http.Transport`.

### Базовая настройка

Ключ к использованию прокси с аутентификацией в Go - создание пользовательского `http.Client` с `Transport`, в котором установлено поле `Proxy`.

```go basic_setup.go icon="golang" lines wrap theme={null}
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
)

func main() {
    // 1. Скопируйте их со страницы «Настройки прокси» вашего прокси
    proxyHost := "proxy.catproxy.net"
    proxyPort := 5555
    proxyUser := "PROXY_USERNAME"
    proxyPass := "PROXY_PASSWORD"

    // 2. Соберите URL прокси с учётными данными
    proxyURLString := fmt.Sprintf("http://%s:%s@%s:%d", proxyUser, proxyPass, proxyHost, proxyPort)
    proxyURL, err := url.Parse(proxyURLString)
    if err != nil {
        log.Fatalf("Failed to parse proxy URL: %v", err)
    }

    // 3. Создайте кастомный HTTP-транспорт и задайте прокси
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    // 4. Создайте HTTP-клиент на основе этого транспорта
    client := &http.Client{
        Transport: transport,
    }

    // 5. Отправьте запрос!
    fmt.Println("Making request to IP checker...")
    resp, err := client.Get("https://api.ipify.org?format=json")
    if err != nil {
        log.Fatalf("Failed to make request: %v", err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("Failed to read response body: %v", err)
    }

    fmt.Printf("Success! Your proxy IP is: %s\n", string(body))
}
```

### Пример из реальной практики: парсинг заголовков Hacker News

Давайте создадим простое, но эффективное приложение на Go для парсинга заголовков лучших историй с главной страницы Hacker News (`news.ycombinator.com`). Это классическая цель для парсинга.

Этот пример демонстрирует, как создать повторно используемую функцию для парсинга, что позволяет легко адаптировать ее для других целей. Мы будем работать с Hacker News так, как будто находимся в **Великобритании (GB)**.

<Info>
  В этом примере используется пакет `goquery` для удобного парсинга HTML, аналогичного jQuery. Установите его командой:
  `go get github.com/PuerkitoBio/goquery`
</Info>

```go hn_scraper.go icon="golang" lines wrap theme={null}
package main

import (
    "fmt"
    "log"
    "net/http"
    "net/url"

    "github.com/PuerkitoBio/goquery"
)

// --- Your Base Credentials ---
const (
    BASE_USERNAME   = "PROXY_USERNAME"
    PASSWORD        = "PROXY_PASSWORD"
    PROXY_HOST      = "proxy.catproxy.net"
    PROXY_PORT      = 5555
)

// createProxyClient creates and returns an http.Client configured with our proxy.
func createProxyClient(region string) (*http.Client, error) {
    // Dynamically construct the username for the target region
    proxyUser := fmt.Sprintf("%s-country-%s", BASE_USERNAME, region)

    proxyURLString := fmt.Sprintf("http://%s:%s@%s:%d", proxyUser, PASSWORD, PROXY_HOST, PROXY_PORT)
    proxyURL, err := url.Parse(proxyURLString)
    if err != nil {
        return nil, fmt.Errorf("failed to parse proxy URL: %w", err)
    }

    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    client := &http.Client{
        Transport: transport,
    }

    return client, nil
}

func main() {
    targetRegion := "gb" // Great Britain
    fmt.Printf("--- Scraping Hacker News from %s ---\n", targetRegion)

    // Create our custom, proxy-enabled HTTP client
    client, err := createProxyClient(targetRegion)
    if err != nil {
        log.Fatal(err)
    }

    // Make the request to Hacker News
    resp, err := client.Get("https://news.ycombinator.com")
    if err != nil {
        log.Fatalf("Failed to scrape Hacker News: %v", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != 200 {
        log.Fatalf("Hacker News returned a non-200 status code: %d %s", resp.StatusCode, resp.Status)
    }

    // Load the HTML document into goquery
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    if err != nil {
        log.Fatalf("Failed to parse HTML: %v", err)
    }

    fmt.Println("Top 5 Headlines:")
    // Find the story links and print their titles
    doc.Find("tr.athing .titleline > a").Each(func(i int, s *goquery.Selection) {
        if i < 5 { // Limit to the top 5 for this example
            title := s.Text()
            fmt.Printf("%d. %s\n", i+1, title)
        }
    })
}
```

### Как запустить

1. Убедитесь, что у вас установлен Go.
2. Установите пакет `goquery`: `go get github.com/PuerkitoBio/goquery`
3. Сохраните код как `hn_scraper.go`.
4. Запустите из терминала: `go run hn_scraper.go`

### Ожидаемый результат

```bash Terminal icon="terminal" theme={null}
--- Scraping Hacker News from gb ---
Top 5 Headlines:
1. Show HN: I built a terminal UI for ChatGPT
2. The unreasonable effectiveness of just showing up everyday
3. Why are manhole covers round?
4. A 16-bit virtual machine from scratch
5. SQLite is not a toy database
```

Этот пример показывает, как чисто структурировать приложение для парсинга на Go, отделив создание прокси-клиента от основной логики парсинга. Этот шаблон можно легко расширить для параллельного парсинга с помощью горутин.
